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