Как создать пакет в Java?

Как создать пакет в Java? фото
Author: Tatyana Milkina
  1. Что такое пакет?
  2. Добавление класса в пакет
  3. Правила для именования пакета
  4. Компиляция и запуск пакетных файлов
  5. Пример многоуровневого пакета
  6. Импорт пакетов
  7. Ключевые моменты

1. Что такое пакет?

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

2. Добавление класса в пакет

Как добавить класс в пакет? Для этого нам нужно выполнить два действия:

  • Первое - для добавления класса в пакет мы используем специальный оператор package, который задаётся всегда первой строкой в файле.
  • И второе - этот класс должен находиться в одноимённом нашему пакету каталоге.

В следующем примере мы демонстрируем как добавить класс MyFirstApp в пакет lesson1.

Для добавления класса в пакет, используется оператор package, который задается всегда первой строкой в файле. А также этот класс должен находиться в одноименном нашему пакету каталоге  - lesson1.

Полное имя класса теперь lesson1.MyFirstApp. То есть, полное имя класса включает в себя название пакета.

package lesson1;

public class MyFirstApp {
    public static void main(String[] args) throws Exception {
        System.out.print("Hello world!!!");
    }
}

3. Правила для именования пакета

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

Допустим у нас есть сайт examclouds.com и в нашем проекте мы хотим разместить примеры кода. Мы можем использовать такие пакеты com.examсlouds.examples. code.lesson1. Либо же com.examсlouds.examples. code.lesson2. В имени пакета принято использовать только маленькие буквы.

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

4. Компиляция и запуск пакетных файлов

Давайте рассмотрим компиляцию и запуск пакетных файлов на примере. Допустим у нас есть проект с такой структурой - у нас есть project1, в котором находятся каталоги src и classes. В src у нас есть каталог пакетный lesson1, в котором находится наш класс MyFirstApp.java:

Структура проекта

Мы будем компилировать этот файл из каталога project1/src и для того чтобы его скомпилировать мы используем ключик -d, как и в прошлых наших уроках. Используем ключик d, указываем куда мы хотим поместить классы и далее мы указываем относительный путь к файлу, который мы хотим откомпилировать:

cd project1/src
javac -d ../classes  lesson1/MyFirstApp.java

После компиляции в каталоге classes создается каталог lesson1, в котором находится MyFirstApp.class.  Если же он уже есть, то файл class просто запишется в него.

Для того чтобы запустить нашу программу, мы переходим в каталог classes и запускаем, используя полное имя класса lesson1.MyFirstApp.

cd project1/classes 
java lesson1.MyFirstApp

5. Пример многоуровневого пакета

В следующем примере мы добавим наш класс в многоуровневый пакет com.company.lesson1. Полное имя класса теперь у нас будет com.company.lesson1.MyFirstApp, а файл соответственно будет находиться в каталоге com/company/lesson1:

package com.company.lesson1;

public class MyFirstApp {
    public static void main(String[] args) throws Exception {
        System.out.print("Hello world!!!");
    }
}

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

6. Импорт пакетов

Теперь давайте рассмотрим как обращаться к одному классу из другого пакета.

Рассмотрим пример, в котором имеется два класса находящихся в разных пакетах - first.Example1 и second.Example2:

package first;

public class Example1 {
    public static void main(String[] args) {
        second.Example2 example2 = new second.Example2();
        System.out.print("Done!");
    }
}
package second;

public class Example2 {
}

Класс first.Example1 создает экземпляр объекта second.Example2, указывая его полное имя. Очевидно, что указывать полное имя класса не очень удобно, особенно если класс находится в многоуровневом пакете. 

Для того чтобы упростить обращение к классу и не писать его полное имя, существует импорт классов. Для этого существует специальный оператор import. Операторы import следуют за оператором package, если таково имеется, и перед любыми определениями классов. В данном случае мы импортируем класс Example2.

Перепишем класс first.Example1 используя оператор import:

package first;

import second.Example2;

public class Example1 {
    public static void main(String[] args) {
        Example2 example2 = new Example2();
        System.out.print("Done!");
    }
}

Разные варианты написания import: 

import java.util.regex.Matcher;
import java.time.*;

Существует один пакет, классы которого импортируются в код по умолчанию. Это пакет jаva.lang, в котором находятся наиболее часто используемые классы.

Вы можете импортировать два пакета, в которых находятся классы с одинаковыми именами. Но обращаться к ним по короткому имени будет ошибкой - компилятор не сможет определить какой именно класс вам нужен. Поэтому к таким классам придется обращаться только по полному имени.

При импорте пакета, доступны только publiс классы этого пакета. Например, в следующем примере класс MyClass импортирует весь пакет p1. Но ему будут доступен только AClass. BClass недоступен, так как он не public.

package p1;

public class AClass {
}

class BClass {
}
package p2;

import p1.*;

public class MyClass {
    public static void main(String[] args) {
        AClass aClass = new AClass();
        BClass bClass = new BClass(); //ошибка компиляции. Класс недоступен, т. к. он не public
    }
}

Если оператор package отсутствует, то имена классов размещаются в пакете используемом по умолчанию и не имеющем имени. То, как мы делали допустим, в предыдущих статьях. Пакеты по умолчанию используются только в обучающих программах, демонстрационных программах и в реальных проектах, конечно же, следует их избегать и использовать пакеты

7. Ключевые моменты

  1. Используем оператор package для объявления пакета, который задается всегда первой строкой в файле.
  2. Если оператора package нет, то классы добавляются в пакет по умолчанию, у которого нет имени.
  3. Класс должен находиться в одноименном нашему пакету каталоге файловой системы.
  4. Можно (и нужно) создавать иерархию пакетов. Для разделения используется точка.
  5. Один пакет может содержать множество классов. 
  6. Полное имя класса включает в себя название пакета.
  7. Пакеты служат и для управления доступностью объектов.
  8. В языке Java операторы import всегда пишутся после оператора package, и перед написанием класса.
  9. Классы пакета jаva.lang импортируются компилятором неявно.

Презентацию с видео можно скачать на Patreon.

Курс 'Java для начинающих' на Udemy Курс 'Java для начинающих' на Udemy
Читайте также:
Комментарии
Artimas
Jun 29, 2020
Туговато доходи смысл этого - "При импорте пакета классам, не производным от классов из данного пакета в импортирующем коде, будут доступны только те элементы пакета, которые объявлены как publiс." Можете описать это другими словами? Короткими предложениями? )
sysadmin
Jun 30, 2020
Исправила это предложение и добавила пример. Когда мы импортируем весь пакет, нам будут доступны только public классы.
Fazbart
Aug 14, 2021
Комментарии не работают
Fazbart
Aug 14, 2021
Не получается оставить комментарий с проблемой. Обычные комментарии проходят
sysadmin
Aug 16, 2021
Комментарий с проблемой - что имеется ввиду? Код не сохраняется в комментарии?