Сперва поупражняемся по мотивам видео представленного ниже.
Очень хороший урок и объяснение внутренних классов и так же удачный пример.
Собственно это мое повторение примера приведенного в видео.
По большому счету здесь и объяснять то нечего, так как в видео все разжевано дальше не куда :)
Единственное на что стоит снова обратить внимание так это на то, что для внутренних классов доступны все поля и методы внешнего класса, даже те что объявлены как private.
Именно поэтому в методах getAmount() и toDeposit() класса Card можно напрямую обратиться к private полю amount.
И катати, да, :) я случайно засунул этот пример в пакет anonym05. Хочу заметить что к анонимным классам данный пример ни какого отношения не имеет :) просто лень его было уже переносить в другой пакет :)
Ну и вывод программы:
Из вывода программы видно, что изменения производимые через объект внутреннего класса изменяют поле amount объекта внешнего класса.
Ну и чтобы все стало еще более понятно приведу скриншот класса Main:
Надеюсь это уже все поставит на свои места.
Сперва создаем экземпляр класса Account – father.
Затем выводим на консоль его состояние.
После создаем экземпляр класса Card – mother.
Выводим его состояние на консоль.
Затем через mother снимаем со счета 18 у.е. :)
Выводим состояние счета через экземпляры классов Account и Card. Видим что оно одинаковое. Как и должно быть.
Пополняем счет через мамочку на 8 у.е., выводим на консоль. Пополняем через папочку на 10 у.е., выводим на консоль.
Все работает как и ожидалось, как и должно было работать.
В следующем примере мы повторим программу из этой статьи, но только уже с использованием анонимного класса.
В единственном методе start() класса Clock, анонимный класс имплементирует интерфейс ActionListener. В данном случае это просто вывод текущего времени на экран. Затем создается объект таймера куда как параметры передаются ссылка на нашу реализацию интерфейса и время через которое будет срабатывать его метод (в нашем случае 1сек.). В метод start так же передается boolean параметр, если он true, то будет еще выводится и линия после вывода времени.
Заметьте, что передаваемый параметр boolean сопровождается модификатором final, хотя если вы используете JDK8, то это не обязательно. Главное чтобы он не изменялся в методе start().
Теперь с новыми знаниями об анонимных классах перепишем пример фабричного метода, который мы уже писали тут. Весь код на скриншоте я приводить тут не буду. Разницу между этим и предыдущим можно посмотреть перейдя по линкам. Но сразу можно сказать что текущий пример стал куда короче.
На скриншоте приведет пример имплементации обоих интерфейсов. Причем имплементация ServiceFactory сделана при помощи анонимного класса, что очень уменьшило объем кода.
Вывод программы представлен слева.
Чтобы все стало более понятно приведу ниже еще и код создания наших "продуктов".
Тут приведен отрывок из кода, который создает наши "продукты" и вызывает на них методы.
Принцип тут тот же, что был описан тут. Это кстати тоже пример (немного переделанный мной) из книги "Философия Java". Хотя там все реализовано было через статическое поле, но я решил сделать чуть по другому :) Чтобы можно было задать имя сервиса и вывести его.
Вроде бы с этим примером все :)
Теперь еще повторим пример фабричного метода с игрой, но уже с анонимными классами. Тут уже не буду приводить отрывков кода, просто можно перейти по линкам и сравнить эти два примера.
И еще один пример итератора с использованием анонимных классов.
Это переделанный вариант кода который мы писали тут.
Вывод у программы не изменился:
Единственное что мы сделали при помощи анонимного класса, так это сражу же в объявлении метода selector() избавились от необходимости создавать отдельный класс SequenceSelector.
В результате этого код стал чуть поменьше и чуть попонятней. А может и менее понятней :), но интересней и занятней :)
Сейчас метод selector() возвращает ссылку на экземпляр анонимного класса приведенную к типу интерфейса ISelector.
И затем через методы анонимного класса происходит вывод значений хранящихся в items. То есть еще раз демонстрируется, что для внутренних классов доступны даже private члены внешнего класса.
Спасибо еще раз. Пока самый полезный блог на блогспоте =) , а еще что-то по джаве будет?
ОтветитьУдалитьПожалуйста. И да конечно будет. Просто как время будет продолжу блог.
ОтветитьУдалить