Что такое пакеты в java программе

Обновлено: 03.07.2024

Пакеты. Использование пакетов в Java. Директивы import и package . Компилированные модули ( *.java ). Промежуточные .class файлы. Структура проекта. Использование стандартных библиотек Java

Содержание

  • 1. Пакеты в Java
  • 2. Как подключить пакет к существующему проекту в Java Eclipse? Структура проекта, который содержит пакеты
  • 3. Какая общая форма вызова класса из пакета? Пример
  • 4. Пример, который демонстрирует использование одного имени класса в разных пакетах и в разных каталогах (папках)
  • 5. Какое назначение директивы import ? Общая форма. Пример
  • 6. Как в директиве import указать, что могут быть использованы все классы из данного пакета?
  • 7. Что собой представляет ключевое слово package ?
  • 8. Что такое компилированный модуль в Java?
  • 9. Какие требования к реализации компилированного модуля ( .java )?
  • 10. Сколько классов могут быть реализованы в компилированном модуле?
  • 11. Какое назначение файлов с расширением .class ?
  • 12. Какие преимущества дает использование ключевых слов package и import ?
  • 13. Пример, который демонстрирует структуру проекта и размещение компилированных модулей
  • 14. Пример подключения класса из стандартной библиотеки Java

Поиск на других ресурсах:

1. Пакеты в Java

Каждый проект на языке Java в своей работе использует так называемые пакеты. Пакет – это отдельный модуль (пространство имен), которому соответствует одноименный каталог (папка). Пакет содержит библиотеки (группы) классов. Эти классы объединены между собой в одном пространстве имен или пакете. Количество реализованных классов в пакете неограничено. Классы, которые объявляются в пакете, реализуются в файлах с расширением *.java .

Пакеты могут иметь разнообразные уровни вложения (подкаталоги, подпапки). На разных уровнях вложения пакетов имена могут повторяться. Сохранение пакетов и файлов *.java в проекте осуществляется в виде древовидной структуры файловой системы.

2. Как подключить пакет к существующему проекту в Java Eclipse? Структура проекта, который содержит пакеты

В системе Java Eclipse подключение пакета есть стандартной командой. Предварительно может быть создан проект. В проекте может размещаться произвольное количество пакетов. В каждом пакете может быть произвольное количество классов.

Для создания пакета в некотором проекте используется команда

В результате откроется окно, изображенное на рисунке 1. В окне указывается имя проекта и пакета, который будет размещаться в этом проекте.

Java Eclipse. Окно "New Java Package". Создание пакета в проекте

После выбора кнопки Finish происходит следующее. Проекту с именем MyProject03 соответствует специальная папка (каталог) с таким же именем. В этом каталоге создается несколько подкаталогов (подпапок). Один из них подкаталог с именем src. В этом подкаталоге создается каталог MyPackage , соответствующий создаваемому пакету.

3. Какая общая форма вызова класса из пакета? Пример

Чтобы обратиться к имени класса из пакета используется следующая общая форма:

  • PackageName – имя пакета, в котором реализован класс с именем ClassName ;
  • ClassName – имя класса.

Если пакет PackageName1 содержит подпапку (подпакет) с именем PackageName2 , то доступ к классу с именем ClassName имеет вид:

Подобным образом формируется доступ к классу в случае более более сложных уровней вложения.

Например. Пусть задан пакет с именем Figures . В пакете реализованы два класса с именами Circle и Rectangle . Тогда, фрагмент кода, который создает объекты этих классов будет следующий:

4. Пример, который демонстрирует использование одного имени класса в разных пакетах и в разных каталогах (папках)

На рисунке 2 изображена иерархия, которую могут образовывать пакеты.

Java Eclipse. Окно Package Explorer. Отображение проектов

Рис. 2. В проекте MyProject03 три пакета с именами MyPackage01 , MyPackage02 , MyPackage02.MyFolder02

Как видно из рисунка, в проекте MyProject03 созданы 3 пакета с именами MyPackage01 , MyPackage02 , MyPackage03 . Каждый из пакетов имеет класс с одинаковым именем MyClass01 . Таким образом происходит разделение одинаковых имен.

Ниже приведен демонстрационный код, создающий объекты классов MyClass01 , которые размещены в разных пакетах (папках), согласно схеме из рисунка 2.

5. Какое назначение директивы import ? Общая форма. Пример

Директива import позволяет сократить весьма длинные строки обращений к классам (интерфейсам, перечислениям), которые реализованы в пакетах.

В простейшем случае общая форма директивы import следующая:

  • PackageName – имя пакета, который подключается;
  • ClassFileName – имя файла с расширением *.java , в котором реализован класс или группа классов, к которому нужно обращаться по сокращенному имени.

Чтобы из любого другого класса, который размещается в другом пакете данного проекта, иметь доступ к методам файла Circle.java из пакета Figures нужно в начале указать:

Ниже приводится пример подключения и использования класса Circle из другого пакета и другого класса.

Если в пакете OtherPackage убрать строку

то объект класса Circle нужно было бы создавать следующим образом

6. Как в директиве import указать, что могут быть использованы все классы из данного пакета?

Бывают случаи, когда в пакете реализованы несколько классов (файлов с расширениями *.java ) и возникает необходимость подключения всего множества классов. В этом случае общая форма директивы import может быть следующая:

  • Package – имя пакета с библиотекой подключаемых классов.
7. Что собой представляет ключевое слово package ?

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

Если в модуле (файле с расширением .java ) указывается строка наподобие

то это означает, что данный модуль есть частью библиотеки с именем PackageName .

8. Что такое компилированный модуль в Java?

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

9. Какие требования к реализации компилированного модуля ( .java )?

К реализации компилированного модуля предъявляются следующие требования:

  • имя компилированного модуля должно иметь расширение .java ;
  • имя компилированного модуля без учета расширения .java должно совпадать с именем открытого ( public ) класса, который реализован в этом модуле;
  • имя компилированного модуля и имя реализованного в нем открытого класса должны начинаться из большой буквы;
  • в компилированном модуле может быть не более одного открытого ( public ) класса. Если в компилированном модуле есть еще другие (вспомогательные) классы, то они должны быть скрытыми (без модификатора public ).
10. Сколько классов могут быть реализованы в компилированном модуле?

Компилированный модуль может иметь любое количество классов. Однако, открытым ( public ) должен быть только один класс. Имя этого класса должно совпадать с именем компилированного модуля.

11. Какое назначение файлов с расширением .class ?

Файлы с расширением .class получаются в результате компиляции файлов с расширением .java (компилированных модулей). Файлы с расширением .class есть промежуточными файлами, которые затем объединяются компоновщиком в исполнительный модуль.

Например, в языке программирования Delphi временные скомпилированные файлы имели расширение *.dcu . В языке программирования C++ временные скомпилированные файлы имели расширение .obj . После компоновки из этих файлов получался *.exe файл (исполняемый модуль).

После этого, файлы с расширением .class объединяются в пакет и сжимаются утилитой JAR . Это все осуществляет интерпретатор Java.

12. Какие преимущества дает использование ключевых слов package и import ?

Использование ключевых слов package и import позволяет удобно поделить пространство имен таким образом, чтобы предотвратить возникновению конфликтов между разными разработчиками классов на Java.

13. Пример, который демонстрирует структуру проекта и размещение компилированных модулей

Пусть в Java Eclipse создан проект с именем Project03 . Проект размещается в папке по умолчанию, которая используется системой Java Eclipse. В проекте созданы 2 пакета с именами Figures , OtherPackage . В пакетах реализованы по одному компилированному модулю соответственно с именами Circle.java и MyClass.java . Рисунок 3 отображает структуру проекта Project03 системы Java Eclipse.

Java Eclipse. Отображение структуры проекта в окне Package Explorer

Рис. 3. Отображение структуры проекта Project03 в окне Package Explorer

В файле (модуле) Circle.java разработан класс Circle . В файле MyClass.java разработан класс MyClass . В классе MyClass из пакета OtherPackage (см. рис. 3) подключается модуль Circle.java с помощью директивы

Если компилятор встречает директиву import , он формирует полное имя с учетом пути к каталогу, который записан по умолчанию в системе.

таким образом, получается полное имя модуля Circle.java :

По желанию путь к каталогу (папке) по умолчанию можно изменить.

14. Пример подключения класса из стандартной библиотеки Java

Чтобы обратиться к имени класса из стандартной библиотеки Java используется один из двух способов:

  1. Использование полной формы или полного имени класса в библиотеке.
  2. Использование сокращенной формы имени класса. В этом случае, полное имя пакета с нужным классом, может быть задано явным образом с помощью директивы import .

Полная форма обращения к имени нужного класса в простейшем случае выглядит так

Например. Фрагмент кода, который использует класс Vector из стандартной библиотеки Java. В данном случае стандартная библиотека Java носит имя java.util .

В вышеприведенном коде происходит обращение к классу Vector по полному имени:

Пакет (package) представляет собой именованную совокупность классов (и, возможно, подпакетов). Пакеты группируют классы и определяют пространства имен для классов, которые в них входят.

Зачем нужны пакеты в Java и что это такое

  • Задание пространства имен, предотвращение коллизий имен классов
  • Логическая группировка связанных классов
  • Инкапсуляция - сокрытие деталей реализации за счет модификаторов доступа

В стандартную библиотеку Java API входят сотни классов. Каждый программист в ходе работы добавляет к ним десятки своих классов. Множество классов растет и становится необозримым. Уже давно принято отдельные классы, решающие какую-то одну определенную задачу, объединять в библиотеки классов. Но библиотеки классов, кроме стандартной библиотеки, не являются частью языка.

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

Каждый пакет создает одно пространство имен (namespace). Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Таким образом, ни один класс, интерфейс или подпакет не может оказаться сразу в двух пакетах. Если надо в одном месте программы использовать два класса с одинаковыми именами из разных пакетов, то имя класса уточняется именем пакета: пакет.Класс. Такое уточненное имя называется полным именем класса (fully qualified name).

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

Определение пакета

Чтобы определить пакет для какого-либо класса, следует использовать директиву package. Если в Java-коде присутствует ключевое слово package, оно должно быть первой лексемой кода в файле Java , то есть должно следовать сразу после комментариев и пробелов. После ключевого слова должно стоять имя требуемого пакета и точка с запятой. Например:

Все файлы с исходными текстами и тем-более откомпилированные файлы с байт-кодом (расширение .calss) должны находится в соответствующих под-каталогах, как, например в данном случае в подкаталоге pro\java\pkg001. Все современные IDE при создании пакета, сразу же создают соответствующую файловую структуру в каталоге проекта, так что об этом можно особо не беспокоиться, но знать необходимо.

Поскольку строка package имя; только одна и это обязательно первая строка файла, каждый класс попадает только в один пакет или подпакет.

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

Компилятор всегда создает для таких классов безымянный пакет (unnamed package), которому соответствует текущий каталог (current working directory) файловой системы.

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

Имя пакета может быть любым, главное чтобы оно было уникальным . Соглашение "Code Conventions" рекомендует записывать имена пакетов строчными буквами. Тогда они не будут совпадать с именами классов, которые, по соглашению, начинаются с прописной буквы. Кроме того, соглашение советует использовать в качестве имени пакета или подпакета доменное имя своего сайта, записанное в обратном порядке, например:

Одной из важных функций пакетов является разделение пространства имен Java и предотвращение конфликта имен между классами. Например, классы java.util.List и java.awt.List можно различить только по именам их пакетов. Однако важно, чтобы различались и имена самих пакетов.

Как работают пакеты

Использование класса из пакета:

  • Классы текущего пакета и пакета java.lang всегда видны
  • Классы других пакетов доступны по полному имени с пакетом, но если они имеют соответствующие модификаторы доступа
  • Можно использовать директиву import

Методы и поля классов в текущем пакете доступны другим классам из этого же пакета, если у них нет ни каких модификаторов доступа (о которых мы поговорим чуть позже).

А вот классы и их поля и методы принадлежащих другим пакетам, если у них нет ни каких модификаторов доступа, уже не доступны даже по полному имени пакета и класса.

Чтобы отдохнуть от теории и понять ее получше немного попрактикуемся и рассмотрим на примере первый пункт использование класса из пакета. Создадим пакет pro.java.pkg001 и в нем два класса:

P0001

P0002

Вывод у программы следующий:

P0003

Как видно у класса Print нет ни каких модификаторов, но все же его статические метод и переменная видны из класса Main и могут им использоваться.

Очень важно заметить, что при компиляции файлов находящихся в пакетах (за исключением пакета по умолчанию), в class-файл попадает полное имя класса, то есть имя_пакета.имя_класса . Поэтому и запускать класс содержащий метод main() надо по полному имени. Кроме того, все другие пакеты и классы, используемые вашей программой должны быть доступны через classpath. Более подробно мы поговорим об этом в конце данной статьи.

Импорт классов и пакетов

Класс пакета pro.java.pkg001 может ссылаться на любой другой класс в pro.java.pkg001 по его простому имени. А поскольку классы пакета java.lang являются базовыми для языка Java, любой Java-код может ссылаться на любой класс этого пакета по его простому имени. Значит, всегда можно набирать String вместо java.lang.String. Однако по умолчанию для всех других классов нужно указывать полные имена. Поэтому, чтобы применить класс File пакета java.io, следует набрать java.io.File.

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

import java.io.File; // Теперь можно набирать File вместо java.io.File

Чтобы импортировать целый пакет классов, введите после import имя пакета, символы .* и точку с запятой. Например, чтобы использовать класс File вместе с несколькими другими классами пакета java.io, нужно просто импортировать целый пакет:

import java.io.*; // Теперь простые имена можно применять для всех классов из java.io

Этот синтаксис импорта пакета не относится к подпакетам . Даже если я импортирую пакет java.util, мне все еще придется обращаться к классу java.util.zip.ZipInputStream по его полному имени. Если два класса, импортированные из разных пакетов, называются одинаково, к ним нельзя обращаться по простому имени; во избежание двусмысленности к обоим классам следует обращаться по их полным именам .

import static java.lang.Math.*;

После этого все статические поля и методы класса Math можно использовать без указания имени класса. Вместо записи:

double r = Math . cos ( Math . PI * alpha ) ;

можно записать просто

double r = cos ( PI * alpha ) ;

Теперь разгаданы и другие строчки, которые были в наших исходниках, например:

import static pro.java.util.Print.*;
import static pro.java.util.Strings.*;

Подчеркнем, что оператор import вводится только для удобства программистов и слово "импортировать" не означает никаких перемещений классов.

Директивы import позволяют компилятору получить полные имена всех используемых классов, полей и методов по их коротким именам. В class-файл попадают полные имена, подстановка содержимого не происходит . Поэтому при запуске программы все используемые классы должны присутствовать в classpath.

Структура файла Java

Теперь можно описать структуру исходного файла с текстом программы на языке Java.

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

Данные элементы могут перемежаться с комментариями, но они должны идти именно в такой последовательности.

Директив import может быть сколько угодно.

Существует еще несколько важных ограничений по файлам Java. Во-первых, каждый файл может содержать максимум один класс, объявленный как public . Такой класс предназначен для использования другими классами в других пакетах. Более подробно public классы и связанные с ними модификаторы мы рассмотрим в следующей статье. Данное ограничение по открытым классам относится только к классам верхнего уровня; как вы скоро узнаете, класс может содержать любое количество вложенных, или внутренних, классов, объявленных как public.

Второе ограничение касается имени файла в Java. Если файл Java содержит класс public, то имя файла должно представлять собой имя public класса, к которому присоединено расширение .java . Например, если Point является public классом, его исходный код должен находиться в файле Point.java.

Отсюда следует, что если в проекте есть несколько открытых классов, то они должны находиться в разных файлах.

Соглашение "Code Conventions" рекомендует открытый класс, если он имеется в файле, описывать первым.

Даже если ваши классы не являются public, полезно определять только по одному классу на файл и давать файлу имя класса. Для технологии Java характерно записывать исходный текст каждого класса в отдельном файле. В конце концов, компилятор всегда создает class-файл для каждого класса.

Исполнение классов в пакетах и CLASSPATH

С запуском нашей простой программы из Eclipse, что была в самом начале, нет ни каких проблем, а вот при запуске из командной строки они могут возникнуть.

Дело в том, что как я уже говорил ранее, в откомпилированный class файл попадает полное имя класса, то есть имя_пакета.имя_класса.

Давайте запустим и посмотрим (обращаем внимание на пути файлов):

P0004

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

javap спасет отца русской демократии! Давайте посмотрим что там у нас скомпилилось?

P0005

Как видим наш класс сейчас называется pro.java.pkg001.Main, то есть наш класс содержит полное имя, включая имя пакета. И кстати обратите внимание на то как объявлен массив String[].

Для контраста рассмотрим любой класс, где мы не использовали пакеты.

P0006

Рассмотрим откомпилированный класс Classes001.

Как видим в данном случае, когда мы не использовали пакеты, имя класса точно такое же как мы и задавали в коде программы. Именно поэтому мы могли запустить наш класс по его короткому имени.

Давайте попробуем запустить наш класс Main по полному имени и посмотрим что получиться.

P0007

Как видим у нас опять ошибка.

P0008

P0009

CLASSPATH должен указывать путь к каталогу, где лежит пакет (верхний каталог пакета), но не на сам каталог или подкаталоги пакета.

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

Пакеты можно определить как группировку связанных типов (классы, интерфейсы, перечисления и аннотации), предоставляющий защиту доступа и управление пространством имён.

Содержание

Некоторые из существующих пакетов в Java:

  • java.lang – связывает фундаментальные классы.
  • java.io – классы для ввода и выводные функции связаны в этом пакете.

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

Так как пакет создаёт новое пространство имён, в нём не будет никаких конфликтов с именами в других пактах. Используя пакеты, легче предоставить управление доступом и легче найти связанные классы.

Создание пакета

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

Оператор package должен быть первой строкой в исходном файле. Может быть только один запрос package в каждом исходном файле, и он применяется ко всем типам в этом файле.

Если оператор package не использован, тогда классы, интерфейсы, перечисления и типы аннотаций будут помещены в текущий пакет по умолчанию.

Чтобы скомпилировать программы на Java с операторами package, то вам нужно использовать опцию –d, как показано ниже.

Затем в указанном месте назначения создается папка с указанным именем пакета, а файлы скомпилированных классов будут помещены в эту папку.

Пример 1

Давайте взглянем на пример, которые создаёт пакет под названием animals. Полезно использовать имена пакетов с маленькой буквы, чтобы избежать конфликтов с именами классов и интерфейсов.

В следующем примере пакета содержится интерфейс с названием animals.

Теперь давайте реализуем вышеприведённый интерфейс в этом же пакете animals:

А сейчас скомпилируем java-файлы, как показано ниже:

Теперь пакет/папка с именем animals будет создана в текущей директории, и файлы классов будут помещены в неё.

Вы можете запустить файл класса внутри пакета и получить результат, указанный ниже.

Ключевое слово import

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

Пример 2

Итак, класс под названием Boss добавлен в пакет payroll, который уже содержит Employee. Boss может обратиться к классу Employee без использования префикса payroll, как показано в следующем классе Boss.

Что произойдёт, если класс Employee не будет включен в пакет payroll? Тогда класс Boss должен будет использовать одну из следующих техник для обращения к классу в другом пакете:

  • Можно использовать полноценное имя класса. К примеру:
  • Импорт пакета. В Java пакет может быть импортирован с помощью ключевого слова import и wild card. (*). Например:
  • Сам класс можно импортировать с помощью ключевого слова import. Взглянем:

Примечание: Файл класса может содержать любое количество операторов импорта (import). Операторы импорта (import) должны появляться после оператора пакета (package) и перед объявлением класса.

Структура директории пакетов

Происходят два явления, когда класс помещён в пакет:

  • Имя пакета в Java становится частью имени класса, как мы только что выяснили в прошлой секции.
  • Имя пакета должно соответствовать со структурой директории, где находится соответствующий байт-код.

Есть лёгкий способ работы с вашими файлами в Java:

Поместите исходный код для класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа с расширением .java.

Теперь поместите исходный файл в директорию, имя которой отражает имя пакета, к которому принадлежит класс:

Полноценное имя класса и пути будет выглядеть так:

  • Имя класса – vehicle.Car
  • Путь к файлу – vehicle\Car.java (в Windows)

В общем, компания использует своё обратное доменное имя в Интернете для своих именований пакетов в Java.

Компилятор создаёт во время компиляции другой файл вывода для каждого класса, интерфейса и перечисления, определённых в нём. Обычное имя файла вывода состоит из имени типа и расширения .class.

Теперь скомпилируйте это, используя опцию –d:

Файлы скомпилируются следующим образом:

Вы можете импортировать все классы и интерфейсы, определённые в \com\apple\computers\ вот так:

Как и исходные файлы .java, скомпилированные файлы .class должны быть в серии директорий, которые отражают имя пакета. Однако путь к файлам .class не должен быть таким же, как путь к исходным файлам .java. Вы можете разделить директории для классов и источников вот так:

Делая так, становится возможным предоставить доступ к директории классов другим программистам, не раскрывая ваши источники. Вам также нужно распределить файлы классов и источников таким образом, чтобы компилятор и Java Virtual Machine (JVM) могли найти все типы, которые использует ваша программа.

Полный путь к директории классов

\classes называется путь класса и устанавливается с системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета к пути класса.

Путь класса может включать несколько путей. Множество путей должны быть отделены точкой с запятой (Windows) или двоеточием (Unix). По умолчанию компилятор и JVM ищут текущую директорию и JAR-файл, содержащий классы платформы Java, чтобы эти директории были автоматически включены в путь класса.

Установить системную переменную CLASSPATH

Чтобы отобразить текущую CLASSPATH переменную, используйте следующие команды в Windows и UNIX (Bourne shell):

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

Пакеты можно определить как группировку связанных типов (классы, интерфейсы, перечисления и аннотации), предоставляющий защиту доступа и управление пространством имён.

Некоторые из существующих пакетов в Java:

  • java.lang – связывает фундаментальные классы.
  • java.io – классы для ввода и выводные функции связаны в этом пакете.

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

Так как пакет создаёт новое пространство имён, в нём не будет никаких конфликтов с именами в других пактах. Используя пакеты, легче предоставить управление доступом и легче найти связанные классы.

Создание пакета

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

Оператор package должен быть первой строкой в исходном файле. Может быть только один запрос package в каждом исходном файле, и он применяется ко всем типам в этом файле.

Если оператор package не использован, тогда классы, интерфейсы, перечисления и типы аннотаций будут помещены в текущий пакет по умолчанию.

Чтобы скомпилировать программы на Java с операторами package, то вам нужно использовать опцию –d, как показано ниже.

Затем в указанном месте назначения создается папка с указанным именем пакета, а файлы скомпилированных классов будут помещены в эту папку.

Пример 1

Давайте взглянем на пример, которые создаёт пакет под названием animals. Полезно использовать имена пакетов с маленькой буквы, чтобы избежать конфликтов с именами классов и интерфейсов.

В следующем примере пакета содержится интерфейс с названием animals.

Теперь давайте реализуем вышеприведённый интерфейс в этом же пакете animals:

А сейчас скомпилируем java-файлы, как показано ниже:

Теперь пакет/папка с именем animals будет создана в текущей директории, и файлы классов будут помещены в неё.

Вы можете запустить файл класса внутри пакета и получить результат, указанный ниже.

Ключевое слово import

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

Пример 2

Итак, класс под названием Boss добавлен в пакет payroll, который уже содержит Employee. Boss может обратиться к классу Employee без использования префикса payroll, как показано в следующем классе Boss.

Что произойдёт, если класс Employee не будет включен в пакет payroll? Тогда класс Boss должен будет использовать одну из следующих техник для обращения к классу в другом пакете:

  • Можно использовать полноценное имя класса. К примеру:
  • Импорт пакета. В Java пакет может быть импортирован с помощью ключевого слова import и wild card. (*). Например:
  • Сам класс можно импортировать с помощью ключевого слова import. Взглянем:

Примечание: Файл класса может содержать любое количество операторов импорта (import). Операторы импорта (import) должны появляться после оператора пакета (package) и перед объявлением класса.

Структура директории пакетов

Происходят два явления, когда класс помещён в пакет:

  • Имя пакета в Java становится частью имени класса, как мы только что выяснили в прошлой секции.
  • Имя пакета должно соответствовать со структурой директории, где находится соответствующий байт-код.

Есть лёгкий способ работы с вашими файлами в Java:

Поместите исходный код для класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа с расширением .java.

Теперь поместите исходный файл в директорию, имя которой отражает имя пакета, к которому принадлежит класс:

Полноценное имя класса и пути будет выглядеть так:

  • Имя класса – vehicle.Car
  • Путь к файлу – vehicle\Car.java (в Windows)

В общем, компания использует своё обратное доменное имя в Интернете для своих именований пакетов в Java.

Компилятор создаёт во время компиляции другой файл вывода для каждого класса, интерфейса и перечисления, определённых в нём. Обычное имя файла вывода состоит из имени типа и расширения .class.

Теперь скомпилируйте это, используя опцию –d:

Файлы скомпилируются следующим образом:

Вы можете импортировать все классы и интерфейсы, определённые в \com\apple\computers\ вот так:

Как и исходные файлы .java, скомпилированные файлы .class должны быть в серии директорий, которые отражают имя пакета. Однако путь к файлам .class не должен быть таким же, как путь к исходным файлам .java. Вы можете разделить директории для классов и источников вот так:

Делая так, становится возможным предоставить доступ к директории классов другим программистам, не раскрывая ваши источники. Вам также нужно распределить файлы классов и источников таким образом, чтобы компилятор и Java Virtual Machine (JVM) могли найти все типы, которые использует ваша программа.

Полный путь к директории классов

\classes называется путь класса и устанавливается с системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета к пути класса.

Путь класса может включать несколько путей. Множество путей должны быть отделены точкой с запятой (Windows) или двоеточием (Unix). По умолчанию компилятор и JVM ищут текущую директорию и JAR-файл, содержащий классы платформы Java, чтобы эти директории были автоматически включены в путь класса.

Установить системную переменную CLASSPATH

Чтобы отобразить текущую CLASSPATH переменную, используйте следующие команды в Windows и UNIX (Bourne shell):

Читайте также: