Java - Пакеты

Пакеты используются в Java для предотвращения конфликтов имен, контроля доступа, упрощения поиска / поиска и использования классов, интерфейсов, перечислений и аннотаций и т. Д.

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

Некоторые из существующих пакетов в 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;

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

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

Когда класс помещается в пакет, возникают два основных результата:

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

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

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

Поместите исходный код для типа класса, интерфейса, перечисления или аннотации в текстовый файл, имя которого является простым именем типа, а расширение - .java.

Например -

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

Теперь поместите исходный файл в каталог, имя которого отражает имя пакета, которому принадлежит класс -

....\vehicle\Car.java

Теперь квалифицированное имя класса и путь будут следующими:

  • Название класса → vehicle.Car
  • Имя пути → vehicle \ Car.java (в windows)

Как правило, компания использует свое перевернутое доменное имя в Интернете для имен своих пакетов.

Example- Интернет-доменное имя компании - apple.com, тогда все имена ее пакетов будут начинаться с com.apple. Каждый компонент имени пакета соответствует подкаталогу.

Example - У компании был пакет 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) могли найти все типы, которые использует ваша программа.

Полный путь к каталогу классов, <path-two> \ classes, называется путем к классам и устанавливается с помощью системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета к пути к классу.

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

Путь к классу может включать несколько путей. Несколько путей следует разделять точкой с запятой (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; экспорт КЛАССА