Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ МИР.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
547 Кб
Скачать
☆

52 Анонимные классы.

Анонимный класс является дальнейшим развитием идеи локального класса. Вместо того чтобы объявлять локальный класс с помощью одного оператора Java и затем с помощью другого оператора создавать экземпляр данного класса, в анонимном классе эти этапы объединены в одну Java-конструкцию. Анонимный класс не имеет имени. К тому же, экземпляр его создается в том же выражении, в котором он объявляется, поэтому такой экземпляр может быть только один. В остальном, анонимные классы по своим свойствам и принципам использования очень похожи на локальные. Интерфейсы не могут быть анонимными. В следующем примере продемонстрировано использование анонимного класса для реализации интерфейса java.io.FilenameFilter. Реализация в данном примере используется для построения списка файлов с расширением Java, которые содержатся в заданном каталоге.

/* Простая программа, предназначенная для вывода списка всех файлов с исходными текстами Java-программ, содержащихся в каталоге, имя которого передается программе через аргумент командной строки. File f соответствует имени каталога. Выводится список файлов в каталоге с использованием заданного объекта фильтра. Анонимный класс определяется в выражении, осуществляющем вызов метода. */

public class mainclass {

public static void main(String[] args) {

File f = new File(args[0]);

String[] list = f.list(new FilenameFilter() {

public boolean accept(File f, String s) {

return s.endsWith(".java");}

});

for (int i = 0; i < list.length; i++) // Выводит список

System.out.println(list[i]);

}}

Как видно из примера, для определения анонимного класса и создания его экземпляра используется обычный синтаксис выражения с оператором new, за которым следует определение тела класса в фигурных скобках. Если имя, стоящее за ключевым словом new, является именем класса, то анонимный класс является подклассом этого именованного класса. Поскольку анонимный класс не имеет имени, нельзя определить и его конструктор в теле класса. Это одно из основных ограничений, которые накладываются на анонимные классы. Любые аргументы, указанные в скобках после имени суперкласса в определении анонимного класса, будут неявно переданы конструктору суперкласса. Поскольку анонимные классы не имеют имен, возникает вопрос: как называются соответствующие им файлы классов? Если откомпилировать пример, то в результате будут созданы два файла классов, mainclass.class и mainclass$1.class. Анонимным классам присваиваются номера, чтобы получить уникальные имена файлов классов на основе имени включающего класса

53 Модель обработки событий Java 1.1.

Модель базируется на концепции слушателя событий (это объект, заинтересованный в получении данного события). В объекте, который порождает событие, содержится список слушателей заинтересованных в получение уведомления о том, что событие произошло, а так же методы, которые позволяют слушателям добавлять или удалять себя из списка. Когда источник порождает события или когда он его регистрирует, он оповещает всех слушателей события об этом. Источник события оповещает объект слушателя путем вызова специального метода и передачи ему объекта события, который является экземпляром подкласса EventObject.

Чтобы источник мог вызвать данный метод он должен быть реализован для каждого слушателя. Потому что все слушатели событий определенного типа должны реализовать соответствующий интерфейс. В пакете java.awt.event определены интерфейсы слушателей для каждого из определенного в нем типа событий. Все интерфейсы слушателей событий являются расширением интерфейса java.Util.EventListener. В нем не опр-ся ни один из методов, но он играет роль интерфейсной метки, с которой определены все слушатели событий. В реальных интерфейсах могут определяться несколько методов. По соглашению методам слушателей может быть передан единственный аргумент, являющийся объектом того события, которому соответствует данный слушатель. В этом объекте должна содержаться вся информация, необходимая программе для формирования реакции на событие.

Для каждого интерфейса слушателей событий, содержащего несколько методов, в пакете java.awt.Event определен простой класс-адаптор, который обеспечивает пустое тело для каждого из методов. Когда нужен только один или несколько методов из интерфейса, то проще получить подкласс класса-адаптора, чем реализовать интерфейс. При получении подкласса адаптора требуется переопределить те методы которые нужны, а при прямой реализации интерфейса приходится реализовать все методы, в том числе и ненужные. Заранее определенные классы адапторы называется как и интерфейсы, которые они реализуют, только в название вместо Listener, стоит слово Adapter.

В методах регистрации слушателей события исп-ся стандартные соглашения об именах. Если источник события порождает событие типа Х, то в нем существует метод addXListener для добавления слушателя и метод removeXListener для его удаления.

54. Jar-файлы

Jar-файлы представляют собой файлы архивов java-файлов. На практике, как правило, аплет состоит из нескольких файлов-классов, файлов-картинок и файлов-инфоресурсов, необходимых ему для работы. В случае использования тэга Applet, в который подгружается файл байт-кода класса аплета, файлы передаются по сети в несжатом виде с помощью отдельного запроса. В Ява 1.1 появляется возможность использования jar-файлов, которые передаются по сети на машину клиента намного быстрее, а метод доступа к любому из файлов этого архива аналогичен для всех аплетов, его использующих.

Для создания jar-файла используется утилита jar в следующем синтаксисе:

%jar of xxx.jar //xxx – имя архива jar, в который надо поместить// 1.class 2.gif //файлы, которые надо поместить в архив

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

Чтобы использовать jar-архив следует указать его в качестве значения атрибута тэга archive. Пример:

<APPLET archive=xxx.jar code=xx.class>

</APPLET>

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

Атрибут archive может содержать список jar-файлов через «,». Веб-браузер или программы просмотра аплетов ищут в архивах все файлы, необходимые для функционирования аплета. В случае, если не удаётся найти файл в архиве, то браузер переходит в прежний режим работы и пытается загрузить требуемые файлы с веб-сервера.

Формат jar-файлов обеспечивает следующие преимущества:

  1. безопасность. В Ява 1.1 появляется возможность снабжать содержимое jar-файлов цифровой подписью. Пользователи, которые распознают цифровую подпись jar-файла, могут выборочно предоставлять запускаемому программному обеспечению права доступа, в которых оно может работать на машине клиента;

  2. уменьшение времени загрузки. Если аплет собран в jar-файл, то файлы класса аплета и связанные с ними ресурсы могут быть загружены в браузер клиента одной транзакцией протокола http без необходимости открывать новое соединение для каждого файла;

  3. экономия памяти. Директива jar контролирует загрузку файлов аплета из архива, используя при этом утилиты и методы экономии памяти. Сюда входит выгрузка объектов, которые аплету больше не нужны, уничтожение экземпляров классов, которые были созданы аплетом и больше для его работы не требуются, а также переупаковка уже использованных объектов;

  4. пакетирование для расширений (имеются ввиду расширения java, используемые в jdk 1.2). Каркас расширений представляет способ, при помощи которого можно добавить функциональность к базовой платформе Java и формат jar-файла определяет пакетирование для данных расширений. Например, если Java работает с 3d-объектами, и файлы, их обрабатывающие, помещаются в jar-архив, то jar-архив имеет расширение j3d. Если аплет использует утилиту JavaMail для своей работы и данные файлы также помещаются в архив, то архив имеет расширение jml;

  5. запечатывание пакетов. Данная возможность также появилась в jdk 1.2. Пакеты, записанные в jar-файлы, можно выборочно запечатать, чтобы усилить проверку целостности версии в пакете. Запечатывание пакета в jar-файл означает, что все классы, определённые в пакете, должны находиться в этом же jar-файле;

  6. управление версиями в пакете. При создании jar-файла в него помещаются данные о файлах, которые архивируются, а также информация о платформе, производителе и версии;

  7. переносимость, т.е. механизм работы с jar-файлами является стандартной частью базового api платформы Java.