«1. Введение

В этом кратком руководстве мы рассмотрим основы пакетов в Java. Мы увидим, как создавать пакеты и получать доступ к типам, которые мы помещаем в них.

Мы также обсудим соглашения об именах и их связь с базовой структурой каталогов.

Наконец, мы скомпилируем и запустим наши упакованные классы Java.

2. Обзор пакетов Java

В Java мы используем пакеты для группировки связанных классов, интерфейсов и подпакетов.

Основными преимуществами этого являются:

    Облегчение поиска связанных типов — пакеты обычно содержат типы, которые логически связаны. Избегание конфликтов имен — пакет поможет нам однозначно идентифицировать класс; например, у нас может быть com.baeldung.Application, а также классы com.example.Application Управление доступом — мы можем контролировать видимость и доступ к типам, комбинируя пакеты и модификаторы доступа

Далее, давайте посмотрим, как мы может создавать и использовать пакеты Java.

3. Создание пакета

Чтобы создать пакет, мы должны использовать оператор package, добавив его в качестве самой первой строки кода в файле.

Поместим тип в пакет с именем com.baeldung.packages:

package com.baeldung.packages;

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

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

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

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

3.1. Соглашения об именах

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

    мы определяем наши имена пакетов в нижнем регистре, имена пакетов разделены точками, также определяются компанией или организацией, которая создает их

Чтобы определить имя пакета на основе организации, мы обычно начинаем с обращения URL-адреса компании. После этого соглашение об именовании определяется компанией и может включать названия подразделений и названия проектов.

Например, чтобы сделать пакет из www.baeldung.com, давайте перевернем его:

com.baeldung

Затем мы можем дополнительно определить подпакеты этого, например com.baeldung.packages или com.baeldung. пакеты.домен.

3.2. Структура каталогов

Пакеты в Java соответствуют структуре каталогов.

Каждый пакет и подпакет имеют свой собственный каталог. Итак, для пакета com.baeldung.packages у нас должна быть структура каталогов com -\u003e baeldung -\u003e packages.

Большинство IDE помогут создать эту структуру каталогов на основе имен наших пакетов, поэтому нам не нужно создавать их вручную.

4. Использование членов пакета

Начнем с определения класса TodoItem в подпакете с именем domain:

package com.baeldung.packages.domain;

public class TodoItem {
    private Long id;
    private String description;
    
    // standard getters and setters
}

4.1. Импорт

Чтобы использовать наш класс TodoItem из класса в другом пакете, нам нужно его импортировать. После импорта мы можем получить к нему доступ по имени.

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

Давайте импортируем весь подпакет предметной области:

import com.baeldung.packages.domain.*;

Теперь давайте импортируем только класс TodoItem:

import com.baeldung.packages.domain.TodoItem;

JDK и другие библиотеки Java также поставляются со своими собственными пакетами. Таким же образом мы можем импортировать уже существующие классы, которые мы хотим использовать в нашем проекте.

Например, давайте импортируем базовый интерфейс Java List и класс ArrayList:

import java.util.ArrayList;import java.util.List;

Затем мы можем использовать эти типы в нашем приложении, просто используя их имена:

public class TodoList {
    private List<TodoItem> todoItems;

    public void addTodoItem(TodoItem todoItem) {
        if (todoItems == null) {
            todoItems = new ArrayList<TodoItem>();
        }
        todoItems.add(todoItem);
    }
}

Здесь мы использовали наши новые классы вместе с основными классами Java, чтобы создать список ToDoItems.

4.2. Полное имя

«Иногда мы можем использовать два класса с одинаковыми именами из разных пакетов. Например, мы можем использовать как java.sql.Date, так и java.util.Date. Когда мы сталкиваемся с конфликтами имен, нам нужно использовать полное имя класса по крайней мере для одного из классов.

Давайте использовать TodoItem с полным именем:

public class TodoList {
    private List<com.baeldung.packages.domain.TodoItem> todoItems;

    public void addTodoItem(com.baeldung.packages.domain.TodoItem todoItem) {
        if (todoItems == null) {
            todoItems = new ArrayList<com.baeldung.packages.domain.TodoItem>();
        }todoItems.add(todoItem);
    }

    // standard getters and setters
}

5. Компиляция с помощью javac

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

Сначала нам нужно скомпилировать наш класс TodoItem, потому что наш класс TodoList зависит от него.

Давайте начнем с открытия командной строки или терминала и перехода в наш исходный каталог.

Теперь давайте скомпилируем наш класс com.baeldung.packages.domain.TodoItem:

> javac com/baeldung/packages/domain/TodoItem.java

Если наш класс скомпилируется корректно, мы не увидим никаких сообщений об ошибках и файл TodoItem.class должен появиться в нашем com/ каталог baeldung/packages/domain.

Для типов, которые ссылаются на типы в других пакетах, мы должны использовать флаг -classpath, чтобы сообщить команде javac, где найти другие скомпилированные классы.

Теперь, когда наш класс TodoItem скомпилирован, мы можем скомпилировать наши классы TodoList и TodoApp:

>javac -classpath . com/baeldung/packages/*.java

Опять же, мы не должны видеть никаких сообщений об ошибках, и мы должны найти два файла классов в нашем каталоге com/baeldung/packages.

Давайте запустим наше приложение, используя полное имя нашего класса TodoApp:

>java com.baeldung.packages.TodoApp

Наш вывод должен выглядеть так:

6. Заключение

В этой короткой статье мы узнали, что такое пакет и почему мы должны их использовать.

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

Наконец, мы рассмотрели, как скомпилировать и запустить приложение с пакетами с помощью команд javac и java.

Полный код примера доступен на GitHub.