Выбрать главу

Объясните, что такое статический импорт? Статический импорт означает размещение статических членов класса или интерфейса в глобальном пространстве имен. Это позволяет использовать статические члены без указания имени соответствующего класса или интерфейса.

Какие действия выполняет приведенный ниже оператор? 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 stkclass="underline" "); 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 ()..

Почему в апплете, который должен работать постоянно, следует организовать многопоточный режим? Многопоточный режим необходим в постоянно выполняющемся апплете, потому что апплет — это управляемая событиями прикладная программа, в которой не предусмотрены длительные операции. Например, метод paint () не будет вызван до тех пор, пока метод start () не возвратит управление.

Видоизмените апплет, созданный в примере для опробования 14.1, таким образом, чтобы в нем отображалась символьная строка, передаваемая ему в качестве параметра. Добавьте еще один параметр, чтобы задавать время задержки (в миллисекундах) между последовательными сдвигами символов строки. / Простой апплет, отображающий крупный заголовок с использованием параметров. / import java.awt.; import java.applet.; / / public class ParamBanner extends Applet implements Runnable { String msg; int delay; Thread t; boolean stopFlag; // инициализировать переменную t пустым значением null public void init() { String temp; 592 Java /.'руководство для начинающих, 5-е издание msg = getParameter("message"); if(msg == null) msg = " Java Rules the Web "; temp = getParameter("delay"); try { if(temp != null) delay = Integer.parselnt(temp); else delay =250; // Если параметр не задан, // используется значение по умолчанию. } catch(NumberFormatException exc) { delay = 250 ; // Если допущена ошибка, используется // значение по умолчанию. } t = null; } // запустить поток public void start() { t = new Thread(this); stopFlag = false; t. start(); } // Точка входа в поток, манипулирующий крупным заголовком, public void run() { char ch; // отобразить крупный заголовок снова for( ; ; ) { try { repaint(); Thread.sleep(delay); * ch = msg.charAt(0); msg = msg.substring(1, msg.length()); msg += ch; if (stopFlag) break; } catch(InterruptedException exc) {} } } // остановить отображение крупного заголовка public void stop() { stopFlag = true; t = null; } // отобразить крупный заголовок public void paint(Graphics g) { g.drawString(msg, 50, 30); Приложение А. Ответы на вопросы для самопроверки 593. } }

Дополнительное задание. Создайте апплет, который отображал бы текущее время, обновляя содержимое своего окна каждую секунду. Для того чтобы справиться с этим заданием, вам придется провести дополнительные изыскания. Для начала примите к сведению следующую подсказку: получить текущее время можно, воспользовавшись объектом класса Calendar, относящегося к пакету java.util. (Напомним, что компания Oracle предоставляет оперативно доступную документацию на все стандартные классы Java.) Приобретенных вами до сих пор знаний должно быть достаточно для того, чтобы самостоятельно изучить класс Calendar и использовать его методы для выполнения этого задания. // Простой апплет, отображающий текущее время. import java.util.; import java.awt.; import java.applet.; /