Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2 2014.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
340.48 Кб
Скачать

Оператор instanceof

Чтобы уточнить, соответствует ли текущее значение переменной конкретному типу, используется оператор instanceof.

Проверим, не является ли текущий пользователь администратором (в этом случае программа должна перейти в режим управления):

if (currentUser instanceof Admin) {...}

Анонимные и вложенные классы

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

Эта возможность иногда используется, чтобы подчеркнуть отношение агрегации между классами. Например, нам может понадобиться класс Eye, чтобы описать сложную структуру и поведение глаза (он может открываться и закрываться). Но объекты этого класса не будут создаваться сами по себе, они являются неотъемлемой частью объектов класса Dog и только их. Поэтому мы помещаем описание класса Eye в класс Dog:

class Dog {

...

class Eye {

private boolean opened;

public void close() {

opened = false;

System.out.println("глаз закрыт");

}

public void open() {

opened = true;

System.out.println("глаз открыт");

}

public boolean isOpened() {

return opened;

}

}

Eye rightEye = new Eye(), leftEye = new Eye();

}

Мы сразу же добавили в класс Dog два поля класса Eye и проинициализировали их вновь созданными объектами (это можно было сделать и в конструкторе). Теперь у собаки есть два глаза и она может открывать их и закрывать. Например, предположим, что все собаки лают с закрытым правым глазом. Тогда метод voice() надо переписать так:

public void voice() {

rightEye.close();

for (int i = 1; i <= age; i++) {

System.out.println("гав-гав");

}

rightEye.open();

}

Обратиться ко вложенному классу нужно с помощью составного имени (в нашем случае это Dog.Eye). Если обращение происходит из содержащего его класса, имя можно сократить.

Класс можно объявить внутри метода другого класса. В этом случае класс «виден» только внутри метода (за пределами метода нельзя объявить переменную типа этого класса).

Анонимным классом называется класс, не имеющий имени. Очевидно, если у класса имени нет, к нему нельзя обратиться из программы. Точнее, это можно сделать только один раз – в том месте, где класс объявляется.

Описание анонимного класса начинается с вызова конструктора его суперкласса, после чего в фигурных скобках описывается тело класса.

Анонимные классы используются в том случае, когда нужен единственный объект такого класса на всю программу.

Пусть, например, в нашей программе собачьего питомника имеется массив dogs объектов типа Dog. И мы хотим добавить в этот массив совершенно уникальную собаку, которая не лает, а разговаривает. Необходимо описать класс, унаследованный от класса Dog, в котором будет соответствующим образом переопределен метод voice(). Но поскольку нам гарантированно понадобится только одна такая собака, мы можем описать анонимный класс прямо в месте добавления собаки в питомник (посадим ее в клетку № 10):

dogs[10] = new Dog(){

public void voice() {

System.out.println("Я уникальная говорящая собака.");

}

};

И, несмотря на то, что мы не сможем создавать переменных этого класса, мы спокойно можем пользоваться новой собакой как объектом класса Dog. А благодаря полиморфизму вызов метода

dogs[10].voice();

приведет к тому, что уникальная собака будет уникально подавать голос.