Интерфейсы, обратные вызовы, внутренние классы
9 Факультет "Информатика и системы управления" Методические указания к лабораторной работе по курсу "Распределенные системы обработки информации" Интерфейсы, обратные вызовы, внутренние классы Москва 2004 г. Оглавление - Цель работы 3
- Задание для домашней подготовки 3
- Задание к лабораторной работе 3
- Содержание отчета 3
- Контрольные вопросы. 4
- Литература. 5
- Приложение 1. Пакеты и интерфейсы 6
- Приложение 2. Вложенные классы 22
- Приложение 3. Интерфейсы и обратные вызовы 28
- Цель работы
- Получить первичные знания об интерфейсах, обратных вызовах и внутренних классах языка Java. Научиться писать программы, использующие интерфейсы, обратные вызовы и внутренние классы.
Задание для домашней подготовкиОзнакомиться с материалом, предоставленным в приложении к данным методическим указаниям. Ознакомиться с текстом задания к лабораторной работе и написать программу. Задание к лабораторной работеНаписать программу, в которой банковский счет управляется таймером. Объект вложенного класса, реализующий интерфейс ActionListener ( отслеживающий действие таймера), каждую секунду добавляет к сумме, лежащей на счету, начисленные на нее проценты. Содержание отчетаОтчет должен содержать:Постановку задачи, решаемой отлаженной программой.Руководство пользователя отлаженной программы, содержащее описание интерфейсов всех функций программы.Листинг программы с необходимыми комментариями.Контрольные вопросы1. Что такое интерфейс в Java?2. Возможно ли расширять интерфейс с использованием механизма наследования?3. Допускают ли интерфейсы множественное наследование?.4. Как организован обратный вызов в Java?.5. Что называется внутренним классом?6. Включает ли внешний класс область видимости внутреннего класса?.7. Можно ли обратиться из внутреннего класса к элементам внешнего класса?ЛитератураОфициальные источники:1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.2. Официальный сайт Java -- http://java.sun.com/ (есть раздел на русском языке с учебником).3. Java™ 2 SDK, Standard Edition Documentation -- http://java.sun.com/products/jdk/1.5/index.html.4. Джеймс Гослинг, Билл Джой, Гай Стил. Спецификация языка Java (The Java Language Specification -- http://www.javasoft.com/docs/books/jls/). Перевод на русский язык -- http://www.uni-vologda.ac.ru/java/jls/index.html5. Официальный сайт проекта Eclipse -- http://www.eclipse.org/.Другое:1. Дмитрий Рамодин. Начинаем программировать на языке Java.2. Николай Смирнов. Java 2: Учебное пособие.3. Картузов А. В. Программирование на языке Java.4. Вязовик Н.А. Программирование на Java.5. Электронный учебник. Автор не известен.Приложение 1. Пакеты и интерфейсыВ стандартную библиотеку Java API входят сотни классов. Каждый программист в ходе работы добавляет к ним десятки своих. Классов. Множество классов становится необозримым. Уже давно принять классы объединять в библиотеки. Но библиотеки классов, кроме стандартной, не являются частью языка. Разработчики Java включили в язык дополнительную конструкцию -- пакеты (packages). Все классы Java распределяются по пакетам. Кроме классов пакеты могут включать в себя интерфейсы и вложенные подпакеты (subpackages). Образуется древовидная структура пакетов и подпакетов. Эта структура в точности отображается на структуру файловой системы. Все файлы с расширением class (содержащие байт-коды), образующие пакет, хранятся в одном каталоге файловой системы. Подпакеты собраны в подкаталоги этого каталога. Каждый пакет образует одно пространство имен (namespace). Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Таким образом, ни один класс, интерфейс или подпакет не может оказаться сразу в двух пакетах. Если надо использовать два класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем пакета: пакет.класс. Такое уточненное имя называется полным именем класса. Пакетами пользуются еще и для того, чтобы добавить к уже имеющимся правам доступа к членам класса private, protected и public еще один, "пакетный" уровень доступа. Если член класса не отмечен ни одним из модификаторов private, protected, public, то, по умолчанию, к нему осуществляется пакетный доступ, а именно, к такому члену может обратиться любой метод любого класса из того же пакета. Пакеты ограничивают и доступ к классу целиком -- если класс не помечен модификатором public, то все его члены, даже открытые, public, не будут видны из других пакетов. Пакет и подпакет Чтобы создать пакет надо просто в первой строке Java-файла с исходным кодом записать строку package имя;, например: package mypack; Тем самым создается пакет с указанным именем mypack и все классы, записанные в этом файле, попадут в пакет mypack. Повторяя эту строку в начале каждого исходного файла, включаем в пакет новые классы. Имя подпакета уточняется именем пакета. Чтобы создать подпакет с именем, например, subpack, следует в первой строке исходного файла написать; package mypack.subpack; и все классы этого файла и всех файлов с такой же первой строкой попадут в подпакет subpack пакета mypack. Можно создать и подпакет подпакета, написав что-нибудь вроде package mypack.subpack.sub; и т. д. сколько угодно раз. Поскольку строка package имя; только одна и это обязательно первая строка файла, каждый класс попадает только в один пакет или подпакет. Компилятор Java может сам создать каталог с тем же именем mypack, a в нем подкаталог subpack, и разместить в них class-файлы с байт-кодами. Полные имена классов А и В будут выглядеть так: mypack.A, mypack.subpack.В. Фирма SUN рекомендует записывать имена пакетов строчными буквами, тогда они не будут совпадать с именами классов, которые, по соглашению, начинаются с прописной. Кроме того, фирма SUN советует использовать в качестве имени пакета или подпакета доменное имя своего сайта, записанное в обратном порядке, например: com.sun.developer До сих пор мы ни разу не создавали пакет. Компилятор всегда создает для таких классов безымянный пакет, которому соответствует текущий каталог файловой системы. Вот поэтому у нас class-файл всегда оказывался в том же каталоге, что и соответствующий Java-файл. Безымянный пакет служит обычно хранилищем небольших пробных или промежуточных классов. Большие проекты лучше хранить в пакетах. Например, библиотека классов Java 2 API хранится в пакетах java, javax, org.omg. Пакет Java содержит только подпакеты applet, awt, beans, io, lang, math, net, rmi, security, sql, text, util и ни одного класса. Эти пакеты имеют свои подпакеты, например, пакет создания графического интерфейса пользователя (ГИП) и графики java.awt содержит подпакеты color, datatransfer, dnd, event, font, geometry, image, print. Конечно, состав пакетов меняется от версии к версии. Права доступа к членам класса Рассмотрим большой пример. Пусть имеется пять классов, размещенных в двух пакетах, как показано на рис. П.1. Рис. П.1. Размещение наших классов по пакетам В файле Base.java описаны три класса: inpi, Base и класс Derivedpi, расширяющий класс Base. Эти классы размещены в пакете pi. В классе Base определены переменные всех четырех типов доступа, а в методах f() классов inp1 и Derivedp1 сделана попытка доступа ко всем полям класса вазе. Неудачные попытки отмечены комментариями. В комментариях помещены сообщения компилятора. Листинг 3.1 показывает содержимое этого файла. Листинг П.1. Файл Base.java с описанием пакета p1 package p1; class Inp1{ public void f () { Base b = new Base(); // b.priv = 1; // "priv has private access in p1.Base" b.pack = 1; b.prot = 1; b.publ = 1; } } public class Base{ private int priv = 0; int pack = 0; protected int prot = 0; public int publ = 0; } class Derivedpi extends Base{ public void f(Base a) { // a.priv = 1; // "priv hаs private access in pi.Base" a.pack = 1; a.prot = 1; a.publ = 1; // priv = 1; // "priv has private access in pi.Base" pack = 1; prot = 1; publ = 1; } } Как видно из листинга П.1, в пакете недоступны только закрытые, private, поля другого класса. В файле Inp2.java описаны два класса: Inp2 и класс Derivedp2, расширяющий класс Base. Эти классы находятся в другом пакете р2. В этих классах тоже сделана попытка обращения к полям класса Base. Неудачные попытки прокомментированы сообщениями компилятора. Листинг П.2 показывает содержимое этого файла. Напомним, что класс Base должен быть помечен при своем описании в пакете p1 модификатором public, иначе из пакета р2 не будет видно ни одного его члена. Листинг П.2. Файл Inp2.java с описанием пакета р2 package p2; import pl.Base; class Inp2{ public static void main(String[] args){ Base b = new Base(); // b.priv = 1; // "priv has private access in pl.Base" // b.pack = 1; // "pack is not public in pl.Base; // cannot be accessed from outside package" // b.prot = 1; //„"prot has protected access in pi.Base" b.publ = 1; } } class Derivedp2 extends Base{ public void, f (Base a){ // a.priv = 1; // "priv has private access in. p1.Base" // a.pack = 1; // "pack, is not public in pi.Base; cannot //be accessed from outside package" // a.prot = 1; // "prot has protected access in p1.Base" a.publ = 1; // priv = 1; // "priv has private access in pi.Base" // pack = 1; // "pack is not public in pi.Base; cannot // be accessed from outside package" prot = 1; publ = 1; super.prot = 1; } } Здесь, в другом пакете, доступ ограничен в большей степени. Из независимого класса можно обратиться только к открытым, public, полям класса другого пакета. Из подкласса можно обратиться еще и к защищенным, protected, полям, но только унаследованным непосредственно, а не через экземпляр суперкласса. Все указанное относится не только к полям, но и к методам. Подытожим все сказанное в табл. П.1. Таблица П.1. Права доступа к полям и методам класса |
| Класс | Пакет | Пакет и подклассы | Все классы | | private | + | | | | | "package" | + | + | | | | protected | | + | + | * | | public | + | + | + | + | | |
Особенность доступа к protected-полям и методам из чужого пакета отмечена звездочкой. Размещение пакетов по файлам То обстоятельство, что class-файлы, содержащие байт-коды классов, должны быть размещены по соответствующим каталогам, накладывает свои особенности на процесс компиляции и выполнения программы. Обратимся к тому же примеру. Пусть в каталоге D:\jdkl.3\MyProgs\ch3 есть пустой подкаталог classes и два файла -- Base.java и Inp2.java, -- содержимое которых показано в листингах П.1 и П.2. Рис. П.2 демонстрирует структуру каталогов уже после компиляции. Мы можем проделать всю работу вручную. 1. В каталоге classes создаем подкаталоги р1 и р2. 2. Переносим файл Base.java в каталог р1 и делаем р1 текущим каталогом. 3. Компилируем Base.java, получая в каталоге р1 три файла: Base.class, Inpl.class, Derivedpl.class.
Страницы: 1, 2, 3
|