Java: руководство для начинающих
Шрифт:
статический импорт и аннотации
Константы перечислимого типа иногда называются самотипизированными. Что это означает? Часть “само” в термине самотипизированный означает тип перечисления, в котором определена константа. Следовательно, константа перечислимого типа является объектом того перечисления, в которое она входит.
Какой класс автоматически наследуют перечисления? Все перечисления наследуют от класса Enum.
Напишите для приведенного ниже перечисления программу, в которой метод values служит для отображения списка констант и их значений. enum Tools { SCREWDRIVER, WRENCH, HAMMER, PLIERS } Это задание имеет следующее решение: enum Tools { SCREWDRIVER, WRENCH, HAMMER, PLIERS } class ShowEnum { public static void main(String args[]) { for(Tools d : Tools.values) System.out.print(d + " has ordinal value of " + d.ordinal + '\n'); } }
Программу, имитирующую автоматизированный светофор и созданную в примере для опробования 12.1, можно усовершенствовать, внеся ряд простых изменений, чтобы выгодно воспользоваться возможностями перечислений. В исходной версии этой программы
Что такое упаковка и распаковка? В каких случаях производится автоупаковка и автораспаковка? Упаковка означает включение значения простого типа в объект оболочки, а распаковка — извлечение значения из объекта оболочки. Автоупаковка означает автоматическую упаковку значения без явного создания объекта, тогда как при автораспаковке значение простого типа автоматически извлекается из объекта оболочки без явного вызова соответствующего метода, например intValue .
Измените следующий фрагмент кода таким образом, чтобы в нем производилась автоупаковка: Short val = new Short(123); Это задание имеет следующее решение: Short val = 123;
Объясните, что такое статический импорт? Статический импорт означает размещение статических членов класса или интерфейса в глобальном пространстве имен. Это позволяет использовать статические члены без указания имени соответствующего класса или интерфейса.
Какие действия выполняет приведенный ниже оператор? import static java.lang.Integer.parselnt; Этот оператор помещает в глобальное пространство имен метод parselnt из класса оболочки типа Integer.
Следует ли употреблять статический импорт от случая к случаю или желательно импортировать статические члены всех классов? Статический импорт уместен только в отдельных случаях. Если доступным окажется слишком много статических членов, это может привести к конфликтам имен и нарушению структуры кода.
Синтаксис аннотации основывается на . интерфейсе
Какая аннотация называется маркером? Маркер — это аннотация без аргументов.
Аннотации применимы только к методам. Верно или неверно? Неверно. Любое объявление может быть аннотировано. Глава 13. Обобщения
Обобщения очень важны, поскольку они позволяют создавать код, который: а) обеспечивает типовую безопасность; б) пригоден для повторного использования; в) отличается высокой надежностью; г) обладает всеми перечисленными выше свойствами. Ответ: г) код обладает всеми перечисленными выше свойствами.
Можно ли указывать простой тип в качестве аргумента типа? Нет, нельзя. В качестве аргументов типа можно указывать только типы объектов.
Как объявить класс FlightSched с двумя параметрами типа? Это задание имеет следующее решение: class FlightSched {
Измените ваш ответ на вопрос 3 таким образом, чтобы второй параметр типа обозначал подкласс, производный от класса Thread. Это задание имеет следующее решение: class FlightSched {
Внесите изменения в класс FlightSched таким образом, чтобы второй параметр типа стал подклассом первого параметра типа. Это задание имеет следующее решение: class FlightSchedCT, V extends Т> {
Что обозначает знак ? в обобщениях? Знак ? обозначает метасимвольный аргумент, который соответствует любому допустимому типу.
Может ли метасимвольный аргумент быть ограниченным? Да. Метасимвольный аргумент может ограничиваться как сверху, так и снизу.
У обобщенного метода My Gen имеется один параметр типа, определяющий тип передаваемого ему аргумента. Этот метод возвращает также объект, тип которого соответствует параметру типа. Как должен быть объявлен метод MyGen ? Это задание имеет следующее решение: <Т> Т MyGen(Т о) {//.. .
Допустим, обобщенный интерфейс объявлен так, как показано ниже, interface IGenlFCT, V extends Т> { // ... Составьте объявление класса MyClass, который реализует интерфейс I Gen IF. Это задание имеет следующее решение: class MyClass implements IGenlFCT, V> { // ...
Допустим, имеется обобщенный класс Counter. Как создать объект его базового типа? Для того чтобы получить базовый тип из обобщенного класса Counter, достаточно указать его имя, не обозначая тип, как показано ниже. Counter х = new Counter; 588 Java 7r руководство для начинающих, 5-е издание
Существуют ли параметры типа на стадии выполнения программы? Нет. Все параметры типа удаляются на стадии компиляции и заменяются соответствующими приводимыми типами. Этот процесс называется стиранием.
Видоизмените ответ на вопрос 10 в упражнении по материалу главы 9 таким образом, чтобы сделать класс обобщенным. По ходу дела создайте интерфейс стека IGenStack, объявив в нем обобщенные методы push и pop . // Обобщенный стек. interface IGenStack { void push(T obj) throws StackFullException; T pop throws StackEmptyException; } // Исключение, возникающее при переполнении стека, class StackFullException extends Exception { int size; StackFullException(int s) { size = s; } public String toString { return "\nStack is full. Maximum size is " + size; } } // Исключение, возникающее при обращении к пустому стеку, class StackEmptyException extends Exception { public String toString { return "\nStack is empty.”; } } // Класс, реализующий стек для хранения объектов обобщенного типа, class GenStack implements IGenStack { private T stck[]; // Массив для хранения элементов стека private int tos; // Вершина стека // построить пустой стек заданного размера GenStack(T[] stckArray) { stck = stckArray; tos = 0; } // построить один стек из другого стека GenStack(T[] stckArray, GenStack ob) { tos = ob.tos; stck = stckArray; try { Приложение А. Ответы на вопросы для самопроверки 589 if(stck.length < ob.stck.length) throw new StackFullException(stck.length); } catch(StackFullException exc) { System.out.println(exc); } // скопировать элементы for(int i=0; i < tos; i++) > stck[i] = ob.stck[i]; } // построить стек с исходными значениями GenStack(T[] stckArray, Т[] а) { stck = stckArray; for(int i = 0; i < a.length; i++) { try { push(a [i]); } catch(StackFullException exc) { System.out.println(exc); } } } // поместить объекты в стек public void push(T obj) throws StackFullException { if(tos==stck.length) throw new StackFullException(stck.length); stck[tos] = obj; tos++; } // извлечь объекты из стека public Т pop throws StackEmptyException { if(tos==0) throw new StackEmptyException; tos—; return stck[tos]; } } // продемонстрировать применение класса GenStack class GenStackDemo { public static void main(String args[]) { // создать пустой стек на 10 элементов типа Integer Integer iStore[] = new Integer[10]; GenStack stkl = new GenStack (i'Store) ; // построить стек из массива String name[] = {"One", "Two", "Three"}; String strStore[] = new String[3]; GenStack stk2 = new GenStack(strStore, name); String str; int n; try { // поместить ряд значений в стек stkl for(int i=0; i < 10; i++) stkl.push(i); } catch(StackFullException exc) { System.out.println(exc); } // построить один стек из другого стека String strStore2[] = new String[3]; GenStack stk3 = new GenStack(strStore2, stk2); try { // отобразить стеки System.out.print("Contents of stkl: "); for(int i=0; i < 10; i++) { n = stkl.pop; System.out.print(n + " "); } System.out.println("\n"); System.out.print("Contents of stk2: "); for(int i=0; i < 3; i++) { str = stk2.pop; System.out.print(str + " "); } System.out.println("\n"); System.out.print("Contents of stk3: "); for(int i=0; i < 3; i++) { str = stk3.pop; System.out.print(str + " "); } } catch(StackEmptyException exc) { System.out.println(exc); } System.out.println; } } Приложение А. Ответы на вопросы для самопроверки 591
Что обозначают угловые скобки (< >)? Угловые скобки обозначают ромбовидный оператор.
Как упростить приведенную ниже строку кода в версии JDK 7? MyClass obj = new MyClass(1.1,"Hi"); Эту строку кода можно упростить, используя ромбовидный оператор следующим образом: MyClass obj = new MyClasso(1.1,"Hi"); Глава 14. Апплеты, события и прочее
Какой метод вызывается первым в начале выполнения апплета? Какой метод вызывается, когда апплет должен быть удален из системы? Выполнение апплета начинается с вызова метода init . А перед удалением апплета вызывается метод destroy ..