Пакеты Photo

Пакеты

  1. Добавление класса в пакет
  2. Импорт пакетов

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

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

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

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

package lesson1;

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

Java также предоставляет возможность создания многоуровневого пакета. В этом примере мы добавляем класс MyFirstApp в пакет com.examclouds.javabasics.lesson1 и соответственно в каталог com/examclouds/javabasics/lesson1.

package com.examclouds.javabasics.lesson1;

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

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

Полное имя класса включает в себя название пакета. В примере 1 полное имя класса  - lesson1.MyFirstApp,  а в примере 2 - com.examclouds.javabasics.lesson1.MyFirstApp.

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

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

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

2.1. Использование класса из другого пакета

Рассмотрим пример, в котором имеется два класса находящихся в разных пакетах - 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, указывая его полное имя. Очевидно, что указывать полное имя класса не очень удобно, особенно если класс находится в многоуровневом пакете. 

2.2. Использование оператора import

Перепишем класс 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!");
    }
}

В языке Java операторы import всегда пишутся после оператора package, и перед определением класса.

Разные варианты написания 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
    }
}

Ключевые моменты:

  1. Используем оператор package для объявления пакета, который задается всегда первой строкой в файле.
  2. Если оператора package нет, то классы добавляются в пакет по умолчанию, у которого нет имени.
  3. Класс должен находиться в одноименном нашему пакету каталоге файловой системы.
  4. Можно (и нужно) создавать иерархию пакетов. Для разделения используется точка.
  5. Один пакет может содержать множество классов. 
  6. Полное имя класса включает в себя название пакета.
  7. Пакеты служат и для управления доступностью объектов.
  8. В языке Java операторы import всегда пишутся после оператора package, и перед написанием класса.
  9. Классы пакета jаva.lang импортируются компилятором неявно.
Read also:
Comments
Artimas
Jun 29, 2020
Туговато доходи смысл этого - "При импорте пакета классам, не производным от классов из данного пакета в импортирующем коде, будут доступны только те элементы пакета, которые объявлены как publiс." Можете описать это другими словами? Короткими предложениями? )
sysadmin
Jun 30, 2020
Исправила это предложение и добавила пример. Когда мы импортируем весь пакет, нам будут доступны только public классы.