Пакеты в java

Пакеты - это папки, в которых лежат исходные коды программы.

src - типичное название папки для всех исходных кодов программы. В ней подпапки - это уже java пакеты.

src-
   pack1-
     pack3-
     pack4-
       A.java
       C.java
     A.java
   pack2-
     B.java

Пример двух пакетов pack1 и pack2. В них могут быть другие пакеты и java-файлы (чаще всего это классы).

В папке src должны лежать только исходные коды программы, т.е. java-файлы. И там еще могут лежать ресурсы. Это картинки, иконки, звуки и т.п. Работа с ресурсами - см. позже. Ничего другого в src класть не нужно.

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

Имя пакета - это полный путь к пакету от корня (src), где каталоги разделяются точкой. Соответственно, в нашем примере есть пакеты:

pack1
pack1.pack3
pack1.pack4
pack2

Эти пакеты абсолютно независимы. Т.е. содержимое пакета pack1.pack3 не считается, что лежит в пакете pack1.

Типичное имя пакета в java достаточно длинное и часто содержит обратный домен фирмы или организации. Например, arts.spbu.ru условный домен ф-та искусств. Тогда наши пакеты принято называть ru.spbu.arts.sem1.task1.

Если вы кладете исходники в каталог src без пакета, то считается, что эти классы находятся в “пакете по-умолчанию”. Таким пакетом пользоваться не рекомендуется.

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

package pack1.pack4;

Полное имя класса

Полное имя класса - это имя пакета и имя класса через точку. В нашем примере есть четыре класса:

pack1.pack4.A
pack1.pack4.C
pack1.A
pack2.B

При использовании в коде таких классов их можно писать с полным именем:

pack1.pack4.A a = new pack1.pack4.A(); 

Чтобы не писать так длинно, нужно либо, чтобы это бы класс текущего пакета, либо использовать оператор import в начале файла.

Другими словами, классы из того же пакета, где вы пишете код, можно использовать без полного имени. Либо можно напиасать import pack1.pack4.A; в начале. Тогда классом A можно пользоваться без полного имени.

Есть много вариантов import, например, можно делать import pack1.pack4.*, это означает импорт всех классов пакета. Еще есть import static java.lang.System.out, который импортирует статический элемент какого-то класса. После этого можно писать out.println().

Многие основные классы типа Object, String находятся в пакете java.lang, этот пакет импортировать не нужно, он импортируется автоматически.

Пустой модификатор доступа у элемента класса (не private, public, protected) означает что элемент виден только для классов этого же пакета.

Модули

Появились с 9-ой версии java. Модуль состоит из нескольких пакетов. В описании модуля указывается, какие пакеты доступны для использования в других модулях (экспортируемые пакеты), какие модули используются (импортируются), и какие пакеты доступны другим модулям для рефлексии (открытые пакеты). Эта информация должна находиться в файле module-info.java, сам файл находится в пакете по-умолчанию, и никаких других классов в пакете по-умолчанию быть не должно.

Пример содержимого:

module ru.spbu.arts.sem3 {
    requires javafx.controls; //это импортируемый модуль
    opens ru.spbu.arts.sem3; // открытый пакет 
}

Модули часто называют как пакеты, хотя это не обязательно.