Страница 129 из 133
Что такое упаковка и распаковка? В каких случаях производится автоупаковка и автораспаковка?Упаковка означает включение значения простого типа в объект оболочки, а распаковка — извлечение значения из объекта оболочки. Автоупаковка означает автоматическую упаковку значения без явного создания объекта, тогда как при автораспаковке значение простого типа автоматически извлекается из объекта оболочки безявного вызова соответствующего метода, например 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 {Приложение А. Ответы на вопросы для самопроверки 589if(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];}}// продемонстрировать применение класса GenStackclass GenStackDemo {public static void main(String args[]) {// создать пустой стек на 10 элементов типа IntegerInteger 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 {// поместить ряд значений в стек stklfor(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 ()..
Почему в апплете, который должен работать постоянно, следует организовать многопоточный режим?Многопоточный режим необходим в постоянно выполняющемся апплете, потому что апплет — это управляемая событиями прикладная программа, в которой непредусмотрены длительные операции. Например, метод paint () не будет вызван дотех пор, пока метод start () не возвратит управление.