1. введение
В этом кратком руководстве мы рассмотрим основы работы с пакетами на Java. Мы увидим, как создавать пакеты и получать доступ к типам, которые мы помещаем в них.
Мы также обсудим соглашения об именах и то, как это связано с базовой структурой каталогов.
Наконец, мы скомпилируем и запустим наши упакованные классы Java.
2. Обзор пакетов Java
В Java мы используем пакеты для группировки связанных классов, интерфейсов и подпакетов .
Основными преимуществами этого являются:
- Упрощение поиска связанных типов – пакеты обычно содержат логически связанные типы
- Избегая конфликтов имен – пакет поможет нам однозначно идентифицировать класс; например, у нас может быть com.baeldung.Приложение, а также com.пример.Применение классы
- Контроль доступа – мы можем контролировать видимость и доступ к типам, комбинируя пакеты и модификаторы доступа
Далее давайте посмотрим, как мы можем создавать и использовать Java-пакеты.
3. Создание пакета
Чтобы создать пакет, мы должны использовать оператор package , добавив его в качестве самой первой строки кода в файле .
Давайте поместим тип в пакет с именем com.baeldung.packages :
package com.baeldung.packages;
Настоятельно рекомендуется помещать каждый новый тип в пакет. Если мы определяем типы и не помещаем их в пакет, они будут отправлены в default или безымянный пакет. Использование пакетов по умолчанию имеет несколько недостатков:
- Мы теряем преимущества наличия пакетной структуры и не можем иметь субпакеты
- Мы не можем импортировать типы в пакете по умолчанию из других пакетов
- Области доступа protected и package-private были бы бессмысленны
Как говорится в спецификации языка Java , безымянные пакеты предоставляются платформой Java SE главным образом для удобства при разработке небольших или временных приложений или при только начинающейся разработке.
Поэтому мы должны избегать использования неназванных или стандартных пакетов в реальных приложениях .
3.1. Соглашения об именовании
Чтобы избежать пакетов с одинаковыми именами, мы следуем некоторым соглашениям об именовании:
- мы определяем наши имена пакетов во всех строчных буквах
- имена пакетов разделены точкой
- имена также определяются компанией или организацией, которая их создает
Чтобы определить имя пакета на основе организации, мы обычно начинаем с реверсирования URL-адреса компании. После этого соглашение об именовании определяется компанией и может включать названия подразделений и названия проектов.
Например, чтобы сделать пакет из www.baeldung.com , давайте перевернем его:
com.baeldung
Затем мы можем дополнительно определить подпакеты этого типа, такие как com.baeldung.packages или com.baeldung.packages.domain.
3.2. Структура каталогов
Пакеты в Java соответствуют структуре каталогов.
Каждый пакет и подпакет имеет свой собственный каталог. Итак, для пакета com.baeldung.packages мы должны иметь структуру каталогов com -> baeldung -> packages .
Большинство идей помогут создать эту структуру каталогов на основе наших имен пакетов, поэтому нам не нужно создавать их вручную.
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 core List interface и ArrayList class:
import java.util.ArrayList;import java.util.List;
Затем мы можем использовать эти типы в нашем приложении, просто используя их имя:
public class TodoList { private ListtodoItems; public void addTodoItem(TodoItem todoItem) { if (todoItems == null) { todoItems = new ArrayList (); } todoItems.add(todoItem); } }
Здесь мы использовали наши новые классы вместе с классами ядра Java, чтобы создать List of TodoItems.
4.2. Полное Наименование
Иногда мы можем использовать два класса с одинаковым именем из разных пакетов. Например, мы можем использовать как java.sql.Date , так и java.util.Дата . Когда мы сталкиваемся с конфликтами именования, нам нужно использовать полное имя класса хотя бы для одного из классов.
Давайте использовать To do Item с полным именем:
public class TodoList { private ListtodoItems; public void addTodoItem(com.baeldung.packages.domain.TodoItem todoItem) { if (todoItems == null) { todoItems = new ArrayList (); }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
Наш вывод должен выглядеть так: