Java — Пакеты
Пакеты используются в Java для предотвращения конфликтов имен, управления доступом, упрощения поиска/нахождения и использования классов, интерфейсов, перечислений и аннотаций и т. д.
Пакет можно определить как группу связанных типов (классов, интерфейсов, перечислений и аннотаций), обеспечивающих защиту доступа и управление пространством имен.
Некоторые из существующих пакетов в Java —
-
java.lang − объединяет основные классы
-
java.io − классы для ввода, функции вывода собраны в этом пакете
Программисты могут определять свои собственные пакеты для объединения групп классов/интерфейсов и т. д. Рекомендуется группировать реализованные вами связанные классы, чтобы программист мог легко определить, связаны ли классы, интерфейсы, перечисления и аннотации.П>
Поскольку пакет создает новое пространство имен, не будет конфликтов имен с именами в других пакетах. Используя пакеты, проще обеспечить контроль доступа, а также проще найти связанные классы.
Создание пакета
При создании пакета вы должны выбрать имя для пакета и включить пакет вместе с этим именем в начале каждого исходного файла, содержащего классы, интерфейсы, перечисления и типы аннотаций, которые вы хотите включить в пакет.
Оператор пакета должен быть первой строкой в исходном файле. В каждом исходном файле может быть только один оператор package, и он применяется ко всем типам в файле.
Если оператор пакета не используется, класс, интерфейсы, перечисления и типы аннотаций будут помещены в текущий пакет по умолчанию.
Чтобы скомпилировать программы Java с операторами пакета, вы должны использовать параметр -d, как показано ниже.
javac -d Destination_folder file_name.java
Затем в указанном месте создается папка с заданным именем пакета, и файлы скомпилированных классов будут помещены в эту папку.
Пример
Давайте рассмотрим пример создания пакета с именем animals. . Рекомендуется использовать имена пакетов строчными буквами, чтобы избежать конфликтов с именами классов и интерфейсов.
Следующий пример пакета содержит интерфейс с именем animals −
/* File name : Animal.java */ package animals; interface Animal { public void eat(); public void travel(); }
Теперь давайте реализуем описанный выше интерфейс в том же пакете animals. −
package animals; /* File name : 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(); } }
Теперь скомпилируйте файлы Java, как показано ниже —
$ javac -d . Animal.java $ javac -d . MammalInt.java
Теперь пакет/папка с названием animals будет создан в текущем каталоге, и эти файлы классов будут помещены в него, как показано ниже.
Вы можете выполнить файл класса в пакете и получить результат, как показано ниже.
Mammal eats Mammal travels
Ключевое слово импорта
Если класс хочет использовать другой класс в том же пакете, имя пакета использовать не нужно. Классы в одном пакете находят друг друга без специального синтаксиса.
Пример
Здесь класс с именем Boss добавляется в пакет расчета заработной платы, который уже содержит Employee. Затем Boss может ссылаться на класс Employee без использования префикса расчета заработной платы, как показано в следующем классе Boss.
package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }
Что произойдет, если класса Employee нет в пакете расчета заработной платы? Затем класс Boss должен использовать один из следующих методов для ссылки на класс в другом пакете.
- Можно использовать полное имя класса. Например —
payroll.Employee
-
Пакет можно импортировать с помощью ключевого слова import и подстановочного знака (*). Например —
import payroll.*;
- Сам класс можно импортировать с помощью ключевого слова import. Например —
import payroll.Employee;
Примечание − Файл класса может содержать любое количество операторов импорта. Операторы импорта должны стоять после оператора пакета и перед объявлением класса.
Структура каталогов пакетов
Когда класс помещается в пакет, возникают два основных результата:
-
Имя пакета становится частью имени класса, как мы только что обсуждали в предыдущем разделе.
-
Имя пакета должно соответствовать структуре каталогов, в которой находится соответствующий байт-код.
Вот простой способ управления вашими файлами в Java —
Поместите исходный код класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа и расширением .java. .
Например —
// File Name : Car.java package vehicle; public class Car { // Class implementation. }
Теперь поместите исходный файл в каталог, имя которого отражает имя пакета, к которому принадлежит класс —
....\vehicle\Car.java
Теперь полное имя класса и путь будут следующими:
- Название класса → транспортное средство.Автомобиль
- Путь → автомобиль\Car.java (в Windows)
Как правило, компания использует обратное доменное имя в Интернете для имен своих пакетов.
Пример − Интернет-доменное имя компании — apple.com, тогда все имена ее пакетов будут начинаться с com.apple. Каждый компонент имени пакета соответствует подкаталогу.
Пример − У компании был пакет com.apple.computers, содержащий исходный файл Dell.java, он должен был находиться в ряде подкаталогов, подобных этому −
....\com\apple\computers\Dell.java
Во время компиляции компилятор создает отдельный выходной файл для каждого определенного в нем класса, интерфейса и перечисления. Базовое имя выходного файла — это имя типа, а его расширение — .class. .
Например —
// File Name: Dell.java package com.apple.computers; public class Dell { } class Ups { }
Теперь скомпилируйте этот файл следующим образом, используя параметр -d —
$javac -d . Dell.java
Файлы будут скомпилированы следующим образом —
.\com\apple\computers\Dell.class .\com\apple\computers\Ups.class
Вы можете импортировать все классы или интерфейсы, определенные в \com\apple\computers\. следующим образом —
import com.apple.computers.*;
Как и исходные файлы .java, скомпилированные файлы .class должны находиться в ряде каталогов, соответствующих имени пакета. Однако путь к файлам .class не обязательно должен совпадать с путем к исходным файлам .java. Вы можете упорядочить каталоги исходного кода и классов отдельно, как —
<path-one>\sources\com\apple\computers\Dell.java <path-two>\classes\com\apple\computers\Dell.class
Делая это, можно предоставить доступ к каталогу классов другим программистам, не раскрывая свои источники. Вам также необходимо управлять исходными файлами и файлами классов таким образом, чтобы компилятор и виртуальная машина Java (JVM) могли найти все типы, которые использует ваша программа.
Полный путь к каталогу классов,
Скажем,
Путь к классу может включать несколько путей. Несколько путей должны быть разделены точкой с запятой (Windows) или двоеточием (Unix). По умолчанию компилятор и JVM выполняют поиск в текущем каталоге и файле JAR, содержащем классы платформы Java, так что эти каталоги автоматически находятся в пути к классам.
Установить системную переменную CLASSPATH
Чтобы отобразить текущую переменную CLASSPATH, используйте следующие команды в Windows и UNIX (оболочка Bourne) —
- В Windows → C:\> установите CLASSPATH
- В UNIX → % echo $CLASSPATH
Чтобы удалить текущее содержимое переменной CLASSPATH, используйте -
- В Windows → C:\> установите CLASSPATH =
- В UNIX → % unset CLASSPATH; экспортировать ПУТЬ К КЛАССУ
Чтобы установить переменную CLASSPATH –
- В Windows → установите CLASSPATH =C:\users\jack\java\classes
- В UNIX → % CLASSPATH =/home/jack/java/classes; экспортировать ПУТЬ К КЛАССУ
java