Чтобы поместить класс в пакет, нужно указать имя пакета в начале исходного файла перед определением класса. Например, файл Employee.java начинается следующими строками:
1 2 3 4 |
package com.projava.corejava; public class Employee { ..... } |
Если оператор package в исходном файле не указан, то классы, описанные в этом файле, помещаются в пакет по умолчанию. Пакет по умолчанию не имеет имени. До сих пор все рассмотренные нами классы принадлежали пакету по умолчанию. Пакеты следует помещать в подкаталог, путь к которому соответствует полному имени пакета. Например, все файлы классов в пакете com.projava.corejava должны находится в подкаталоге com/projava/corejava(соответственно com\projava\corejava в ОС Windows).
Компилятор помещает файлы классов в ту же структуру каталогов.
Программы, приведенные ниже, распределены по двум пакетам: класс PackageTest принадлежит пакету по умолчанию, а класс Employee — пакету com.projava.corejava. Следовательно, файл Employee.class должен содержаться в подкаталоге com/projava/corejava. Другими словами, структура каталогов должна выглядеть следующим образом:
1 2 3 4 5 6 7 8 |
.(базовый каталог) !-- PackageTest.java !-- PackageTest.class !-- com/ !-- projava/ !-- corejava/ !-- Employee.java !-- Employee.class |
Чтобы скомпилировать эту программу, перейдите в каталог, содержащий файл PackageTest.java, и выполните следующую команду:
1 |
javac Package.java |
Компилятор автоматически найдет файл com/projava/corejava/Employee.java и скомпилирует его.
Рассмотрим более реалистический пример. В данном примере пакет по умолчанию не используется, вместо этого классы распределены по разным пакетам(com.projava.corejava и com.mycompany).
1 2 3 4 5 6 7 8 9 |
.(базовый каталог) !-- com/ !--projava/ !!-- corejava/ !!-- Employee.java !!-- Employee.class !--mycompany/ !-- PayrollApp.java !-- PayrollApp.class |
В этой ситуации вы также должны компилировать и запускать классы из базового каталога, т.е. того каталога, в котором содержится подкаталог com.
1 2 |
javac com/mycompany/PayrollApp.java javac com.mycompany.PayrollApp |
Помните, что компилятор работает с файлами(при указании файла задается путь и расширение .java), а интерпретатор оперирует с классами(для класса указывается пакет).
Компилятор не проверяет структуру каталогов. Предположим, например, что исходный файл начинается со следующей директивы:
1 |
package com.mycompany; |
Этот файл можно скомпилировать, даже если он не находится в каталоге com/mycompany. Исходный файл будет скомпилирован без ошибок, если он не зависит от других пакетов, однако при попытке выполнить эту программу виртуальная машина не найдет классы.