Как создать пакет в Java?
- Что такое пакет?
- Добавление класса в пакет
- Правила для именования пакета
- Компиляция и запуск пакетных файлов
- Пример многоуровневого пакета
- Импорт пакетов
- Ключевые моменты
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. Ключевые моменты
- Используем оператор package для объявления пакета, который задается всегда первой строкой в файле.
- Если оператора package нет, то классы добавляются в пакет по умолчанию, у которого нет имени.
- Класс должен находиться в одноименном нашему пакету каталоге файловой системы.
- Можно (и нужно) создавать иерархию пакетов. Для разделения используется точка.
- Один пакет может содержать множество классов.
- Полное имя класса включает в себя название пакета.
- Пакеты служат и для управления доступностью объектов.
- В языке Java операторы import всегда пишутся после оператора package, и перед написанием класса.
- Классы пакета jаva.lang импортируются компилятором неявно.
Презентацию с видео можно скачать на Patreon.
Курс 'Java для начинающих' на Udemy
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.