Пакет Java организует классы Java в пространства имен , [1] предоставляя уникальное пространство имен для каждого типа, который он содержит. Классы в одном пакете могут получать доступ к закрытым и защищенным членам друг друга.
В общем, пакет может содержать следующие виды типов : классы, интерфейсы , перечисления, записи и типы аннотаций . Пакет позволяет разработчику группировать классы (и интерфейсы) вместе. Все эти классы будут связаны каким-то образом — все они могут иметь отношение к определенному приложению или выполнять определенный набор задач. Программисты также обычно используют пакеты для организации классов, принадлежащих к одной категории или предоставляющих схожую функциональность.
В исходном файле Java пакет, к которому принадлежит класс или классы этого файла, указывается ключевым package
словом . Это ключевое слово обычно является первым ключевым словом в исходном файле. В исходном файле может быть максимум одно объявление пакета.
пакет java.awt.event ;
Чтобы использовать классы пакета внутри исходного файла Java, удобно импортировать классы из пакета с помощью import
объявления. Следующее объявление
импорт java.awt.event.* ;
импортирует все классы из java.awt.event
пакета, в то время как следующее объявление
импорт java.awt.event.ActionEvent ;
импортирует только ActionEvent
класс из пакета. После любого из этих деклараций импорта на ActionEvent
класс можно ссылаться, используя его простое имя класса:
ActionEvent myEvent = new ActionEvent ();
Классы также можно использовать напрямую без объявления импорта, используя полное имя класса. Например,
java.awt.событие.ActionEvent myEvent = new java.awt.событие.ActionEvent ( ) ;
не требует предварительной импортной декларации.
Документация, объясняющая пакет в целом, написана как Javadoc в файле с именем `package-info.java`. Этот файл также является местом для аннотаций, которые будут использоваться во всех классах пакета. [2]
Если объявление пакета не используется, классы помещаются в безымянный пакет. Классы в безымянном пакете не могут быть импортированы классами в любом другом пакете. [3] Официальный учебник Java не рекомендует этого делать:
Открытые члены и классы видны везде, а закрытые члены видны только в том же классе. Классы внутри пакета могут получать доступ к классам и членам, объявленным с доступом по умолчанию ( package-private ), а также к членам класса, объявленным с protected
модификатором доступа. Доступ по умолчанию (package-private) применяется, когда класс или член не был объявлен как public
, protected
или private
. Напротив, классы в других пакетах не могут получать доступ к классам и членам, объявленным с доступом по умолчанию. Однако к членам класса, объявленным как , protected
можно получить доступ из классов в том же пакете, а также из классов в других пакетах, которые являются подклассами объявляющего класса. [5]
Файлы JAR создаются с помощью утилиты командной строки jar. Команда
jar cf мойПакет.jar *.класс
сжимает все файлы .class в файл JAR myPackage.jar . Параметр 'c' в командной строке сообщает команде jar о необходимости "создать новый архив". Параметр 'f' сообщает о необходимости создания файла. Имя файла следует за содержимым файла JAR.
Пакеты обычно определяются с использованием иерархического шаблона именования , при этом некоторые уровни в иерархии разделяются точками ( .
, произносится как «точка»). Хотя пакеты, находящиеся ниже в иерархии именования, часто называются «подпакетами» соответствующих пакетов, находящихся выше в иерархии, между пакетами практически нет семантической связи. Спецификация языка Java устанавливает соглашения об именовании пакетов, чтобы избежать возможности того, что два опубликованных пакета будут иметь одинаковое имя. Соглашения об именовании описывают, как создавать уникальные имена пакетов, так что пакеты, которые широко распространены, будут иметь уникальные пространства имен. Это позволяет пакетам быть отдельно, легко и автоматически установленными и каталогизированными.
В общем, имя пакета начинается с доменного имени верхнего уровня организации, затем домена организации, а затем любых поддоменов, перечисленных в обратном порядке. Затем организация может выбрать конкретное имя для своего пакета. Последующие компоненты имени пакета варьируются в соответствии с собственными внутренними соглашениями об именовании организации. [6]
Например, если организация в Канаде под названием MySoft создает пакет для работы с дробями, то наименование пакета ca.mysoft.fractions отличает пакет дробей от другого похожего пакета, созданного другой компанией. Если немецкая компания под названием MySoft также создает пакет дробей, но называет его de.mysoft.fractions , то классы в этих двух пакетах определяются в уникальном и отдельном пространстве имен.
Полные соглашения по устранению неоднозначности имен пакетов и правила именования пакетов, когда доменное имя Интернета не может быть напрямую использовано в качестве имени пакета, описаны в разделе 7.7 Спецификации языка Java. [7]
В Java 9 (выпущенной 21 сентября 2017 г.) поддержка «модулей», своего рода наборов пакетов, была реализована в результате усилий по разработке Project Jigsaw. «Модули» ранее назывались «суперпакетами» и изначально планировались для Java 7.
Модули описывают свои зависимости в объявлении, размещенном в файле module-info.java в корне иерархии исходных файлов модуля. Начиная с Java 9 , JDK может проверять зависимости модулей как во время компиляции, так и во время выполнения. Сам JDK является модульным для Java 9. [8] [9]