Иллюстрированный самоучитель по Java
ГЛАВА 3
Пакеты и интерфейсы
В стандартную библиотеку Java API
входят сотни классов. Каждый программист в ходе работы добавляет к ним десятки
своих. Множество классов становится необозримым. Уже давно принять классы объединять
в библиотеки. Но библиотеки классов, кроме стандартной, не являются частью языка.
Разработчики Java включили в язык
дополнительную конструкцию —
паке-ты
(packages). Все классы Java распределяются
по пакетам. Кроме классов пакеты могут включать в себя интерфейсы и вложенные
подпакеты
(subpackages). Образуется древовидная структура пакетов и подпакедчэв.
Эта структура в точности отображается
на структуру файловой системы. Все файлы с расширением class (содержащие байт-коды),
образующие пакет, хранятся в одном каталоге файловой системы. Подпакеты собраны
в подкаталоги этого каталога.
Каждый пакет образует одно
пространство
имен
(namespace). Это означает, что все имена классов, интерфейсов и подпакетов
в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это
будут разные программные единицы. Таким образом, ни один класс, интерфейс или
под-пакет не может оказаться сразу в двух пакетах. Если надо использовать два
класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем
пакета:
пакет.класс
. Такое уточненное имя называется
полным именем класса
(fully qualified name).
Все эти правила, опять-таки, совпадают
с правилами хранения файлов и подкаталогов в каталогах.
Пакетами пользуются еще и для того,
чтобы добавить к уже имеющимся правам доступа к членам класса
private,
protected
и
public
еще один, "пакетный"
уровень доступа.
Если член класса не отмечен ни одним
из модификаторов
private, protected, public,
то, по умолчанию,
к нему осуществляется
пакетный доступ
(default access), а именно, к такому
члену может обратиться любой метод любого класса из того же пакета. Пакеты ограничивают
и доступ к классу целиком — если класс не помечен модификатором
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
До сих пор мы ни разу не создавали
пакет. Куда же попадали наши файлы с откомпилированными классами?
Компилятор всегда создает для таких
классов
безымянный пакет
(unnamed package), которому соответствует текущий
каталог (current working directory)
файловой системы. Вот поэтому у
нас 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, im,image, print.
Конечно, состав пакетов меняется
от версии к версии.