Пакеты в 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; // открытый пакет
}
Модули часто называют как пакеты, хотя это не обязательно.