Java: руководство для начинающих
Шрифт:
Как правило, при именовании класса для него выделяется имя в пространстве имен. Пространство имен определяет область объявлений. В Java нельзя присваивать двум классам одинаковые имена из одного и того же пространства имен. Иными словами, в пределах пространства имен каждый класс должен иметь уникальное имя. В примерах программ, представленных в предыдущих главах, по умолчанию использовалось глобальное пространство имен. Это удобно для небольших программ, но по мере увеличения объема кода могут возникнуть конфликты имен. В крупных программах бывает нелегко выбрать уникальное имя для класса. Более того, при использовании библиотек и кода, написанного другими программистами, приходится принимать специальные меры для предотвращения конфликтов имен. Для разрешения подобных затруднений
Пакет обычно содержит логически связанные классы, и поэтому в Java определены специальные права доступа к содержимому пакета. Так, в пакете можно определить один код, доступный другому коду из того же самого пакета, но недоступный из других пакетов. Это позволяет создавать автономные группы связанных вместе классов и делать операции в них закрытыми. Определение пакета
Каждый класс в Java относится к тому или иному пакету. Если оператор package отсутствует в коде, то используется глобальный пакет, выбираемый по умолчанию. Пакет по умолчанию не имеет имени, что упрощает его применение. Именно поэтому в рассмотренных до сих пор примерах программ не нужно было беспокоиться о пакетах. Но если пакет по умолчанию подходит для очень простых программ, служащих в качестве примера, то для реальных приложений он малопригоден. Как правило, для разрабатываемого кода приходится определять один или несколько пакетов.
Для создания пакета достаточно поместить оператор package в начало файла с исходным кодом программы на Java. В результате классы, определенные в этом файле, будут принадлежать указанному пакету. А поскольку пакет определяет пространство имен, имена классов, содержащихся в файле, войдут в это пространство имен как составные его части.
Общая форма оператора package выглядит следующим образом: package имя_пакета;
Например, приведенная ниже строка кода определяет пакет mypack. package mypack;
Для управления пакетами в Java используется файловая система, в которой для хранения содержимого каждого пакета выделяется отдельный каталог. Например, файлы с расширением . class, содержащие классы и объявленные в пакете mypack, будут храниться в каталоге mypack.
Подобно другим именам в Java, имена пакетов зависят от регистра символов. Это означает, что каталог, предназначенный для хранения пакета, должен иметь имя, в точности совпадающее с именем пакета. Если у вас возникнут затруднения при опробовании примеров программ, представленных в этой главе, проверьте соответствие имен пакетов именам каталогов. Пакеты всегда именуются прописными буквами.
В разных файлах могут содержаться одинаковые операторы package. Этот оператор лишь определяет, какому именно пакету должны принадлежать классы, код которых содержится в данном файле, и не запрещает другим классам входить в состав того же самого пакета. Как правило, пакеты реальных программ распространяются на большое количество файлов.
В Java допускается создавать иерархию пакетов. Для этого достаточно разделить имена пакетов точками. Ниже приведена общая форма оператора package для определения многоуровневого пакета. package пакет_1. пакет_2. пакет_3. . . пакет_Ы;
Очевидно, что для поддержки иерархии пакетов следует создать аналогичную иерархию каталогов. Например: package alpha.beta.gamma;
Классы, содержащиеся в данном пакете, должны храниться в структуре каталогов . . . /alpha/beta/gamma, где многоточие обозначает путь к каталогу alpha. Поиск пакета и переменная окружения CLASSPATH
Как пояснялось выше, иерархия каталогов пакетов должна отражать иерархию пакетов. В связи с этим возникает важный вопрос: как исполняющая система Java узнает, где искать созданные пакеты? Ответ на этот вопрос следует разделить на три части. Во-первых, по умолчанию исполняющая система Java обращается к текущему рабочему каталогу. Так, если поместить пакет в подкаталоге
Рассмотрим в качестве примера следующее определение пакета: package mypack
Для того чтобы программа могла найти пакет mypack, должно быть выполнено одно из трех условий: программа должна быть запущена из каталога, содержащего пакет mypack; в переменной окружения CLASSPATH должен храниться полный путь к каталогу с пакетом mypack; либо при запуске программы интерпретатору java должен быть передан параметр -classpath и указан путь к каталогу с пакетом mypack.
Для опробования примеров программ, представленных далее в этой книге, проще всего создать в текущем каталоге, используемом для разработки программ, структуру каталогов, предназначенных для хранения пакетов, а затем разместить файлы с расширением . class в соответствующих каталогах и далее выполнять программы из каталога, выбранного для разработки.
Во избежание каких-либо осложнений все файлы с расширением .java и .class рекомендуется хранить в том каталоге, который выделен для содержащего их пакета. Кроме того, каждый исходный файл следует компилировать из того каталога, который находится по иерархии выше каталога с пакетом. Простой пример применения пакета
С учетом всего сказанного выше, попробуем сначала написать несложную программу, использующую пакет, а затем запустить ее на выполнение. Эта программа предназначена для создания простой базы данных книг. Классы этой программы будут содержаться в пакете bookpack. // Простая программа, демонстрирующая применение пакета. // Этот файл является частью пакета bookpack. package bookpack; // Класс Book принадлежит пакету bookpack. class Book { private String title; private String author; private int pubDate; Book(String t, String a, int d) { title = t; author = a; pubDate = d; } void show { System.out.println(title); System.out.println(author); System.out.println(pubDate); System.out.println; } } // Класс BookDemo принадлежит пакету bookpack. class BookDemo { public static void main(String args[]) { Book books[] = new Book[5]; books[0] = new Book("Java: A Beginner's Guide", "Schildt", 2011); books[1] = new Book("Java: The Complete Reference", "Schildt", 2011); books[2] = new Book("The Art of Java", "Schildt and Holmes", 2003); books[3] = new Book("Red Storm Rising", "Clancy", 1986); books[4] = new Book("On the Road", "Kerouac", 1955); for(int i=0; i < books.length; i++) books[i].show; } }
Присвойте файлу с приведенным выше исходным кодом имя BookDemo. j ava и поместите его в каталог bookpack.
Скомпилируйте этот исходный файл из каталога, находящегося непосредственно над каталогом bookpack, указав в командной строке следующее: javac bookpack/BookDemo.j ava
После этого попробуйте выполнить скомпилированную программу, указав в командной строке следующее: java bookpack.BookDemo
Не забывайте, что для нормального выполнения указанных выше команд текущим должен быть каталог, являющийся родительским по отношению к каталогу bookpack. (Для компиляции и запуска программы из какого-нибудь другого каталога вам придется указать путь к каталогу bookpack, используя один из двух других описанных выше способов обращения к каталогам с пакетами.)
Теперь классы BookDemo и Book принадлежат пакету bookpack. Это означает, что при вызове интерпретатора нельзя ограничиваться передачей ему только имени класса BookDemo. Приведенная ниже команда не будет выполнена, java BookDemo
Перед именем класса BookDemo следует непременно указать имя его пакета, как показано выше. Пакеты и доступ к членам классов
В предыдущих главах были представлены основные механизмы управления доступом, в том числе модификаторы private и public. И теперь самое время продолжить обсуждение вопросов управления доступом к членам классов. Ведь и пакеты принимают участие в управлении доступом.