Пакет Java

Чтобы лучше организовать классы, Java предоставляет механизм пакетов для разграничения пространств имён для имён классов.

Роль пакетов

  • 1. Объединять классы или интерфейсы со схожей или связанной функциональностью в один пакет, чтобы было легко находить и использовать классы.

  • 2. Как и папки, пакеты также используют древовидный способ хранения каталогов. Имена классов внутри одного пакета различаются, а имена классов из разных пакетов могут совпадать. Когда одновременно вызываются классы с одинаковым именем из двух разных пакетов, нужно добавить имя пакета, чтобы различить их. Поэтому пакеты позволяют избежать конфликтов имён.

  • 3. Пакеты также определяют права доступа. Только классы с доступом на уровне пакета могут обращаться к классам в определённом пакете.

Java использует механизм пакетов для предотвращения конфликтов имён, управления доступом и обеспечения поиска и определения местоположения классов, интерфейсов, перечислений и аннотаций.

Синтаксис инструкции package:

package pkg1[.pkg2[.pkg3…]];

Например, файл Something.java со следующим содержимым:

package net.java.util; public class Something{ ... }

Тогда его путь должен быть:net/java/util/Something.javaсохранён таким образом. Пакет используется для классификации и хранения различных Java-программ, что позволяет другим Java-программам удобнее их вызывать.

Пакет можно определить как группу взаимосвязанных типов (классов, интерфейсов, перечислений и аннотаций), обеспечивающую защиту доступа и управление пространством имён для этих типов.

Ниже приведены некоторые пакеты в Java:

  • java.lang- Пакеты для базовых классов
  • java.io- Пакеты, содержащие функциональность ввода/вывода

Разработчики могут сами объединять группу классов и интерфейсов в пакет и определять собственные пакеты. Это стоит рекомендовать в реальной разработке. После завершения реализации классов группировка связанных классов позволяет другим программистам легче определить, какие классы, интерфейсы, перечисления и аннотации связаны между собой.

Поскольку пакет создаёт новое пространство имён, он не вызовет конфликтов имён с какими-либо именами в других пакетах. Использование механизма пакетов упрощает реализацию контроля доступа и поиск связанных классов.


Создание пакетов

При создании пакета нужно выбрать для него подходящее имя. После этого, если другой исходный файл содержит классы, интерфейсы, перечисления или типы аннотаций, предоставляемые этим пакетом, объявление пакета должно быть размещено в начале этого исходного файла.

Объявление пакета должно находиться в первой строке исходного файла. Каждый исходный файл может содержать только одно объявление пакета, и все типы в этом файле относятся к нему.

Если исходный файл не использует объявление пакета, то классы, функции, перечисления, аннотации и т. д. в нём будут помещены в безымянный пакет.

Примеры

Рассмотрим пример. Этот пример создаёт пакет с именем animals. Обычно для именования используются строчные буквы, чтобы избежать конфликтов с именами классов и интерфейсов.

Добавьте интерфейс в пакет animals:

Код файла Animal.java:

/*Имя файла: Animal.java*/ package animals; interface Animal { public void eat(); public void travel(); }

Затем добавьте реализацию этого интерфейса в тот же пакет:

Код файла MammalInt.java:

package animals; /*Имя файла: MammalInt.java*/ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }

Затем скомпилируйте эти два файла и поместите их в подкаталог с именем animals. Используйте следующую команду для запуска:

$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travel

Ключевое слово import

Чтобы использовать члены пакета, нам нужно явно импортировать этот пакет в Java-программе.

В Java,import— ключевое слово, используемое для импорта типов, определённых в других классах или пакетах, чтобы эти типы можно было использовать в текущем исходном файле.

importКлючевое слово используется для импорта классов, интерфейсов или статических членов из других пакетов. Оно позволяет напрямую использовать классы из других пакетов в вашем коде без полного указания имени пакета класса.

В исходном файле Java оператор import должен находиться в начале исходного файла Java. Его синтаксис:

import package1[.package2…].(classname|*);

Оператор import размещается после оператора package:

//Первая строка, не являющаяся комментарием, — это оператор package. package com.example; //Оператор import импортирует классы из других пакетов. import java.util.ArrayList; import java.util.List; //Определение класса public class MyClass { //Члены класса и методы }

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

Вы можете использовать оператор import для импорта конкретного класса:

import com.example.MyClass;

Таким образом, вы можете напрямую использовать методы, переменные или константы класса MyClass в текущем исходном файле.

Вы также можете использовать подстановочный знак*для импорта целого пакета или подпакета:

import com.example.mypackage.*;

Таким образом, вы можете импортироватьcom.example.mypackageвсе классы пакета, чтобы можно было использовать методы, переменные или константы любого класса из этого пакета в текущем исходном файле. Обратите внимание, что при использовании подстановочного знака*для импорта целого пакета импортируются только классы этого пакета, а не его подпакеты.

При импорте класса или пакета необходимо указать полное имя класса или пакета. Полное имя включает комбинацию имени пакета и имени класса, где точка.используется в качестве разделителя.

Примеры

import java.util.ArrayList; // Импорт класса ArrayList из пакета java.util
import java.util.*; // Импорт всех классов из пакета java.util

import com.example.MyClass; // Импорт класса MyClass из пакета com.example
import com.example.*; // Импорт всех классов из пакета com.example

Пример

Пакет payroll ниже уже содержит класс Employee. Далее мы добавляем класс Boss в пакет payroll. Когда класс Boss ссылается на класс Employee, ему не нужно использовать префикс payroll. Пример класса Boss выглядит следующим образом.

Код файла Boss.java:

package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }

Что если класс Boss не находится в пакете payroll? Класс Boss должен использовать один из следующих методов для ссылки на классы из других пакетов.

Используйте полное имя класса, например:

payroll.Employee

использоватьimportИспользуйте ключевое слово для импорта, используя подстановочный знак*:

import payroll.*;

Используйтеimportв качестве ключевого слова для импорта класса Employee:

import payroll.Employee;

Примечание:

Файл класса может содержать любое количество объявлений import. Объявления import должны находиться после объявления package и перед объявлением class.


Структура каталогов пакетов

Размещение классов в пакетах даёт два основных результата:

  • Имя пакета становится частью имени класса, как обсуждалось ранее.
  • Имя пакета должно соответствовать структуре каталогов, в которой находится соответствующий байт-код.

Вот простой способ управлять вашими собственными файлами Java:

Поместите исходный код таких типов, как классы и интерфейсы, в текстовый файл. Имя файла — это имя типа с расширением .java. Например:

//Имя файла: Car.java package vehicle; public class Car { //Реализация класса }

Далее поместите исходный файл в каталог, соответствующий имени пакета класса.

....\vehicle\Car.java

Теперь правильное имя класса и путь будут выглядеть так:

  • Имя класса -> vehicle.Car

  • Имя пути -> vehicle\Car.java (в системах Windows)

Обычно компания использует обратную форму своего интернет-доменного имени в качестве имени пакета. Например, если интернет-домен — example.com, все имена пакетов начинаются с com.example. Каждая часть имени пакета соответствует подкаталогу.

Например, существуетcom.example.testпакет, который содержит исходный файл с именем Example.java. Соответственно, должна быть следующая серия подкаталогов:

....\com\example\test\Example.java

При компиляции компилятор создаёт отдельный выходной файл для каждого типа, такого как класс или интерфейс, определённого в пакете. Имя выходного файла — это имя типа с расширением .class. Например:

//Имя файла: Example.java package com.example.test; public class Example { } class Google { }

Теперь давайте скомпилируем этот файл с опцией -d, как показано ниже:

$javac -d . Example.java

Это разместит скомпилированные файлы, как показано ниже:

.\com\example\test\Example.class
.\com\example\test\Google.class

Вы можете импортировать все \com\example\test\ классы, интерфейсы и т. д., определённые в:

import com.example.test.*;

Скомпилированные .class-файлы следует размещать, как и исходные .java-файлы, в каталогах, соответствующих имени пакета. Однако не требуется, чтобы путь к .class-файлу совпадал с путём соответствующего .java-файла. Вы можете располагать каталоги исходных файлов и классов отдельно.

<path-one>\sources\com\example\test\Example.java
<path-two>\classes\com\example\test\Google.class

Таким образом, вы можете поделиться каталогом классов с другими программистами, не раскрывая свой исходный код. Управление исходным кодом и файлами классов таким способом позволяет компилятору и виртуальной машине Java (JVM) находить все типы, используемые в вашей программе.

Абсолютный путь каталога классов называетсяпутём к классамЗадаётся в системной переменнойCLASSPATHКомпилятор и виртуальная машина Java строят путь к .class-файлам, добавляя имя пакета к пути к классам.

<path- two>\classes — это путь к классам, имя пакета — com.example.test, а компилятор и JVM будут искать .class-файлы в <path-two>\classes\com\example\test.

Путь к классам может содержать несколько путей. Несколько путей должны разделяться разделителем. По умолчанию компилятор и JVM ищут в текущем каталоге. JAR-файлы содержат классы, связанные с платформой Java, поэтому их каталоги по умолчанию помещаются в путь к классам.


Установка системной переменной CLASSPATH

Используйте следующую команду, чтобы отобразить текущую переменную CLASSPATH:

  • Платформа Windows (командная строка DOS): C:\> set CLASSPATH
  • Платформа UNIX (в оболочке Bourne): # echo $CLASSPATH
Очистите содержимое текущей переменной CLASSPATH:
  • Платформа Windows (командная строка DOS): C:\> set CLASSPATH=
  • Платформа UNIX (в оболочке Bourne): # unset CLASSPATH; export CLASSPATH

Установите переменную CLASSPATH:

  • Платформа Windows (командная строка DOS): C:\> set CLASSPATH=C:\users\jack\java\classes
  • Платформа UNIX (в оболочке Bourne): # CLASSPATH=/home/jack/java/classes; export CLASSPATH
Другие расширения