Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры-1 оопип часть 4.doc
Скачиваний:
30
Добавлен:
01.04.2014
Размер:
112.64 Кб
Скачать

27. Пакеты в Java (Определение пакета, пакет и подпакет, защита и управление доступом, импорт пакетов)

Пакет (package) — это некий контейнер, который используется для того, чтобы изолировать имена классов. Например, вы можете создать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть если бы кто-нибудь еще создал класс с именем List.

Все идентификаторы, которые мы до сих пор использовали в наших примерах, располагались в одном и том же пространстве имен (name space). Это означает, что нам во избежание конфликтных ситуаций приходилось заботиться о том, чтобы у каждого класса было свое уникальное имя. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла .java есть 4 одинаковых внутренних части, из которых мы до сих пор в наших примерах использовали только одну. Ниже приведена общая форма исходного файла Java.

одиночный оператор package (необязателен)

любое количество операторов import (необязательны)

одиночное объявление открытого (public) класса

любое количество закрытых (private) классов пакета (необязательны)

Оператор package

Первое, что может появиться в исходном файле Java — это оператор package, который сообщает транслятору, в каком пакете должны опре­деляться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию. Если вы объявляете класс, как принадлежащий определенному пакету, например,

package java.awt.image;

то и исходный код этого класса должен храниться в каталоге java/awt/image.

После оператора package, но до любого определения классов в исходном Java-файле, может присутствовать список операторов import. Паке­ты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора import такова:

import пакет1 [.пакет2].(имякласса|*);

Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необязательное имя пакета, вложенного в первый пакет и отделенное точкой. И, наконец, после указания пути в иерархии пакетов, указывается либо имя класса, либо метасимвол звездочка. Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вместо имени класса. В приведенном ниже фрагменте кода показаны обе формы использования оператора import : import java.util.Date

В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищен­ный), которые употребляются в различных комбинациях. Содержимое ячеек таблицы определяет доступность переменной с данной комбинацией модификаторов (столбец) из указанного места (строка).

28. Использование classpath

Сlasspath представляет собой связующее звено между исполняемым модулем Java и файловой системой. Он описывает, где компилятор и интерпретатор ищут пакет файлов .class для загрузки. Основная идея заключается в том, что иерархия файловой системы отражает иерархию пакета Java, а classpath указывает, какие директории в файловой системе являются корневыми для иерархии пакета Java.

Каталог, который транслятор Java будет рассматривать, как корневой для иерархии пакетов, можно задавать с помощью переменной окру­жения СLASSPATH. С помощью этой переменной можно задать несколько корневых каталогов для иерархии пакетов (через ; как в обычном PATH).

Переменная среда CLASSPATH Содержит упорядоченный список (с двоеточиями в качестве разделителей для UNIX и с точками с запятой — для Windows) каталогов и файлов с расширением ziр, в которых appletviewer должен искать определения классов. Когда путь указан с помощью переменной среды, appletviewer всегда неявно добавляет место расположения системных классов к концу пути. Если эта переменная не указана, по умолчанию список содержит текущий каталог и путь к системным классам. Отметим, что appletviewer поддерживает аргумент командной строки -classpath, за исключением его косвенной поддержки через опцию -J.

Освоение classpath начинается с исходного кода. Каждый класс принадлежит пакету, а этот пакет должен соответствовать стандартным соглашениям по именованию. Вкратце: имя пакета начинается с двухуровневого реверсированного имени домена, например com.example или edu.poly. За ним следует как минимум еще одно слово, которое описывает содержимое пакета. Например, так как у меня есть имя домена elharo.com, то если бы я писал класс Fraction, то мог бы разместить его в одном из следующих пакетов:

com.elharo.math

com.elharo.numbers

com.elharo.math.algebra.fields

После реверсированного имени домена используйте только имена подпакетов, состоящие из одного слова. Не используйте аббревиатуры и следите за правописанием слов. При необходимости используйте программы проверки орфографии. Самое большое число проблем, связанных с classpath, вызваны использованием в исходном коде одного слова, а в файловой системе - аббревиатуры этого слова, или того же самого слова, но с незначительно отличающейся орфографией. Единственным разумным решением является постоянное использование правильно написанных несокращенных имен.

Полное имя пакета должно состоять из строчных букв, даже для имен собственных и аббревиатур, которые обычно пишутся заглавными буквами. На самом деле Windows не различает заглавные и строчные буквы, используемые в именах файлов, в отличие от Java и некоторых файловых систем UNIX. Зависимость от регистра - это верный путь к возникновению проблем при перемещении файлов из одной системы в другую.