1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8
2 © Luxoft Training 2012 Перечисления Вложенные классы Статические вложенные классы Классы, определенные внутри метода Анонимные классы Модуль 8 Расширенные вопросы
3 © Luxoft Training 2012 Перечисления Очень часто требуется вводить перечислимые типы:
4 © Luxoft Training 2012 Перечисления В Java 1.5 появился новый механизм перечислений (enum). Перечисление – это подкласс класс java.lang.Enum. Перечисление решает указанную проблему и может быть использовано в операторе switch. Перечисление – это обычный класс, с некоторыми ограничениями.
5 © Luxoft Training 2012 Перечисления и оператор switch
6 © Luxoft Training 2012 Отличие перечислений от классов Декларируются с помощью ключевого слова enum Нельзя явно создавать экземпляр перечисления. Нельзя расширять перечисление. Перечисление может быть аргументом в switch.
7 © Luxoft Training 2012 Конструкторы для перечислений
8 © Luxoft Training 2012 Перечисления Результат: Имеет встроенный метод name(), возвращающий значение перечисления. Статический метод values() позволяет получить список всех значений перечисления.
9 © Luxoft Training 2012 Перечисления Вложенные классы Статические вложенные классы Классы, определенные внутри метода Анонимные классы Модуль 8 Расширенные вопросы
10 © Luxoft Training 2012 Вложенные классы Вложенный класс – это класс, объявленый в рамках описания другого класса. Класс можно объявить в любом блоке, включая блоки, являющиеся частью метода. Вложенные классы отличаются своей видимостью и областью доступа. Внимание! Классы, вложенные в метод, называются локальными.
11 © Luxoft Training 2012 Пример вложенного класса
12 © Luxoft Training 2012 Вложенные классы Полное имя вложенного класса в примере OuterOne.InnerOne. После компиляции создается отдельный файл с именем OuterOne$InnerOne.class. Для создания внутреннего класса, необходим экземпляр внешнего класса, который выступает в роли контекста. Внимание! Все атрибуты внешнего класса доступны вложенному классу в следствии существования ссылки вложенного класса на внешний (позже в этом модуле).
13 © Luxoft Training 2012 Вложенные классы Создать экземпляр вложенного класса можно только через экземпляр внешнего класса. public static void main(String[] args) { OuterOne.InnerOne i = new OuterOne().new InnerOne(); i.innerMethod(); OuterOne outer = new OuterOne(); OuterOne.InnerOne inner = outer.new InnerOne(); } Вложенный класс может быть public, private или protected.
14 © Luxoft Training 2012 Перечисления Вложенные классы Статические вложенные классы Классы, определенные внутри метода Анонимные классы Модуль 8 Расширенные вопросы
15 © Luxoft Training 2012 Статические вложенные классы Вложенный класс может быть помечен как static. Вложенный статический класс не может использовать this для доступа к атрибутам внешнего объекта. Может обращаться к статическим переменным и методам внешнего класса.
16 © Luxoft Training 2012 Перечисления Вложенные классы Статические вложенные классы Классы, определенные внутри метода Анонимные классы Модуль 8 Расширенные вопросы
17 © Luxoft Training 2012 Классы внутри метода Все что объявлено внутри метода – не является членом класса. Локальные объекты не могут иметь модификаторов доступа и быть объявлеными как static. Возможно создание анонимных классов. Анонимный класс может иметь доступ к внешним объектам, только если они объявлены как final.
18 © Luxoft Training 2012 Классы внутри метода
19 © Luxoft Training 2012 Классы внутри метода
20 © Luxoft Training 2012 Перечисления Вложенные классы Статические вложенные классы Классы, определенные внутри метода Анонимные классы Модуль 8 Расширенные вопросы
21 © Luxoft Training 2012 Анонимные классы Иногда класс, определенный внутри метода, не нуждается в имени. Анонимный класс может быть объявлен как расширяющий другой, или как реализующий интерфейс.
22 © Luxoft Training 2012 Анонимные классы Иногда класс, определенный внутри метода, не нуждается в имени. Анонимный класс может быть объявлен как расширяющий другой, или как реализующий интерфейс.
23 © Luxoft Training 2012 Анонимные классы Пример: Закрытие пользовательского окна по клику на кнопке Close Реакция оформлена в виде отдельного класса: class CloseActionListener implements ActionListener
24 © Luxoft Training 2012 Анонимные классы
25 © Luxoft Training 2012 Анонимные классы Внимание! Нельзя использовать наследование и имплементацию одновременно.
26 © Luxoft Training 2012 Анонимные классы Анонимные классы удобны, чтоб избежать придумывания тривиальных имен для классов. Код класса содержит несколько строк. При компиляции создается класс, который называется EnclosingClassName$n, где n порядковый номер анонимного класса. Для анонимных классов нельзя определить конструктор. Можно вызвать конструктор родительского класса.
27 © Luxoft Training 2012 Упражнение Работа с вложенными классами.