Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пакеты. Защита доступа. Импорт пакетов




Пакеты

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

Пакет служит одновременно механизмом и присвоения имен, и управления видимостью. Внутри пакета можно определить классы, не доступные коду вне этого пакета. Можно также определить члены класса, которые видны только другим членам этого же пакета. Такой механизм позволяет классам располагать полными сведениями друг о друге, но не предоставлять эти сведения остальному миру.

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

Хотя для коротких примеров программ пакет, используемый по умолчанию, вполне подходит, он не годится для реальных приложений. В большинстве случаев для кода придется определять пакет.

Пакет задает имя пакета. Например, показанный ниже оператор создает пакет MyPackage:

package MyPackage;

Для хранения пакетов система Java использует каталоги файловой системы. Например, файлы. class любых классов, объявленных в качестве составной части пакета MyPackage, должны храниться в каталоге MyPackage. Помните, что регистр символов имеет значение, а имя каталога должно в точности совпадать имени пакета.

Один и тот же оператор package может присутствовать в более чем одном файле. Этот оператор просто указывает пакет, к которому принадлежат классы, определенные в данном файле. Он не препятствует тому, чтобы другие классы в других файлах были частью этого же пакета. Большинство пакетов, используемых в реальных программах, распределено по множеству файлов.

Java позволяет создавать иерархию пакетов. Для этого применяется символ точки. Оператор многоуровневого пакета имеет следующую общую форму:

package пакет1[. пакет2[. пакет3]];

Иерархия пакетов должна быть отражена в файловой системе среды разработки Java. Необходимо тщательно проверять правильность выбора имен пакетов. Имя пакета нельзя изменить, не изменяя имя каталога, в котором хранятся классы.

Защита доступа

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

Классы и пакеты одновременно служат средствами инкапсуляции и хранилищем пространства имен и области определения переменных и методов. Пакеты играют роль контейнеров классов и других подчиненных пакетов. Классы служат контейнерами данных и кода. Класс – наименьшая единица абстракции Java. Вследствие взаимодействия между классами и пакетами Java определяет четыре категории видимости членов класса.

· Подклассы в одном пакете.

· Классы в одном пакете, не являющиеся подклассами.

· Подклассы в различных пакетах.

· Классы, которые не находятся в одном пакете и не являются подклассами.

Три спецификатора доступа: private, public и protected – предоставляют разнообразные способы создания множество уровней доступа, необходимых для этих категорий.

Импорт пакетов

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

После того как класс импортирован, на него можно ссылаться непосредственно, используя только его имя. Оператор import служит только для удобства программистов и не является обязательным с технической точки зрения для создания завершенной Java-программы. Однако если в приложении придется ссылаться на несколько десятков классов, оператор import значительно уменьшит объем вводимого кода.

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

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

В этой форме пакет1 – имя пакета верхнего уровня, пакет2 – имя подчиненного пакета внутри внешнего пакета, отделенное символом точки (. ). Глубина вложенности пакетов практически не ограничена ничем, кроме файловой системы. И, наконец, имя_класса может быть задано либо явно, либо с помощью символа звездочки (*), который указывает компилятору Java о необходимости импорта всего пакета. Следующий фрагмент демонстрирует применение обеих форм оператора:

import java. util. Date;

import java. io. *;

Использование формы с применением символа звездочки может привести к увеличению времени компиляции – особенно при импорте нескольких больших пакетов. Однако использование формы с применением звездочки никак не влияет на производительность системы времени выполнения или на размеры классов.

Все стандартные классы, поставляемые с системой Java, хранятся в пакете java. Основные функции языка хранятся в пакете java. lang внутри пакета java. Обычно каждый пакет или класс, который нужно использовать, приходится импортировать. Но поскольку система Java бесполезна без многих функций, определенных в пакете java. lang, компилятор неявно импортирует его для всех программ. Это эквивалентно присутствию следующей строки в каждой из программ:

import java. lang. *;

При наличии в двух различных пакетах, импортируемых с применением формы со звездочкой, классов с одинаковыми именами компилятор никак на это не отреагирует, если только не будет предпринята попытка использования одного из этих классов. В этом случае возникнет ошибка времени компиляции, и имя класса придется указать явно, задавая его пакет.

Полностью определенное имя класса с указанием полной иерархии пакетов можно использовать везде, где можно допускается имя класса. Например, в следующем фрагменте кода присутствует оператор импорта:

import java. util. *;

class MyDate extends Date {

}

Этот же пример без оператора import выглядит следующим образом:

class MyDate extends java. util. Date {

}

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...