Пакет (Package) в Java это механизм для инкапсуляции группы классов, под пакетов и интерфейсов. Пакеты используются для:

  • Избежания конфликтов в названиях классов. Например может быть два класса, которые называются Employee, но в двух разных пакетах.
  • Делает поиск и использование классов, интерфейсов, нумераций и аннотаций более удобным.
  • Предоставляет управляемый доступ: protected и default классы доступны только в пакете. protected классы доступны только классам, которые находятся в этом же пакете и наследникам этого класса. Default классы доступны только классам из того же пакета.
  • Пакеты могут быть использованы как инкапсуляция данных или же для того чтобы прятать данные. Все что нужно это добавить классы в пакет. После этого мы можем использовать в своей программе эти классы, используя директиву import. Пакеты - это контейнер для группы классов где некоторые классы могут быть доступны из вне, а другие для внутреннего использования в пакете.

Мы можем использовать классы из пакета столько раз сколько потребуется в программе.

Как работают пакеты?

Имя пакета и структура директорий в проекте зависимы (по сути пакеты это директории). Например, если имя пакет com.idurdyev.staff, то структура директорий будет следующая com/idurdyev/staff.

Соглашение о наименовании пакетов: Пакеты принято называть в обратном порядке, то есть com.idurdyev.test, ru.yourcompanydomain.projectname, etc.

Добавление классов в пакет:  Мы можем добавить класс в пакет, используюя имя пакета в начале программного кода и сохранив класс в директории пакеты.

Подпакеты: Пакеты, которые находятся внутри другого пакета называются подпакеты (subpackages). При этом классы в подпакете не имеют доступ к классам пакета, если классы объявлены как protected или default.

Пример :

import java.util.*;

util - это подпакет, который создан в пакете java.

Доступ к классам внутри пакетов

Рассмотрим следующие примеры :

// Подключаем класс Vector из пакета util.
import java.util.vector; 

// Подключаем все классы из пакета util.
import java.util.*;

Первое выражение необходимо для импорта класса Vector из пакета util, который находится в java. Второе выражение подключается все классы из пакета util.

// Все классы и интерфейсы этого пакета
// будут доступны, но только не классы подпакетов
import package.*;

// Только указанный класс будет доступен в программе.
import package.classname;

// Здесь импортируются классы с одинаковыми названиями, но из разных пакетах.
// В коде следует указывать полный путь класса, включая название пакета.
import java.util.Date;
import my.packag.Date;

...

// Если в вашей программе используются классы с одинаковыми
// названиями, но из разных пакетов, то лучше указать это явно.
java.util.Date date1 = new java.util.Date();
my.packag.Date date1 = new my.packag.Date();

Типы пакетов

Java packages

Встроенные пакеты

Эти пакет содержат большое количество классов, которые являются частью Java API. Вот некоторые встроенные пакеты:

  1. java.lang: Содержит классы для использования самого языка (например классы с примитивными типами, класс для математических операций и т.д.). Этот пакет импортируется автоматически.
  2. java.io: Пакет содержит классы для операций ввода/вывода.
  3. java.util: Содержит утилитарные классы, что в общем-то понятно из названия пакета. Например, Linked List, Dictionary, а так же классы для работы с датой и временем.
  4. java.applet: Содержит классы для создания апплетов.
  5. java.awt: Содержит классы для работы с графическим интерфейсом.
  6. java.net: Содержит классы для работы с сетевыми операциями.

Пользовательские пакеты

Это пакеты, которые создаются пользователями (пользователями языка java). Сначала мы создаем директорию пакета myPackage, затем в нем создает класс MyClass внутри этого пакета.

// Название пакета должно быть таким же как директория
// в котором этот файл будет сохранен
package myPackage;

public class MyClass
{
    public void getNames(String s)
    {        
        System.out.println(s);        
    }
}

Теперь мы можем использовать класс MyClass в нашей программе

/* import 'MyClass' class from 'names' myPackage */
import myPackage.MyClass;

public class PrintName 
{
   public static void main(String args[]) 
   {       
      // Initializing the String variable 
      // with a value 
      String name = "GeeksforGeeks";
      
      // Creating an instance of class MyClass in 
      // the package.
      MyClass obj = new MyClass();
      
      obj.getNames(name);
   }
}

Заметка : MyClass.java должен быть сохранен внутри пакета myPackage.

Использование статического импорта

Статический импорт был представлен в Java в версии 5 и выше, эта возможность разрешает использовать поля и методы, которые объявлены как public static в других класс, без указании класса.

Следующий пример демонстрирует эту возможность:

// Внимание. Ключевое слово static.
import static java.lang.System.*;
  
class StaticImportDemo
{
   public static void main(String args[])
   {      
        // нет необходимости использовать 'System.out'
        out.println("GeeksforGeeks");
   }
}

Некоторые важные моменты:

  1. Каждый класс является частью какого-нибудь пакета.
  2. Если не указан пакет, то класс создается в специальном не именованном пакете.
  3. Все классы и интерфейсы в файле являются частью того же пакета. Множество файлов могут быть установлены в тот же пакет.
  4. Если задано имя пакета, то файл должен располагаться в той же директории, с именем как у заданного пакета. (то есть директория должна называться так же как и пакет)
  5. Мы можем получить доступ к публичным классам в любом другом пакете,  используя выражение: package-name.class-name

Данный материал является переводом этой статьи.

Удачи