Урок 1

Пакеты


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

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

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

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

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

package lesson1;

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

Пример 2. Добавление класса в многоуровневый пакет

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. После того как класс импортиро­ван, на него можно ссылаться непосредственно, используя только его имя. 

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

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

package first;

import second.Example2;

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

public class Example2 {
}

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

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

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

package first;

import second.Example2;

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

В исходном файле программы нa java операторы import должны следовать непосредственно за оператором package (если таковой имеется) и перед любыми определениями классов.

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

import java.util.Date;
import java.io.*;

Все классы из стандартной библиотеки Jаvа хранятся в пакете java. Основные языковые средства хранятся в пакете jаva.lang, входящем в пакет jаva. Обычно каждый пакет или класс, который требуется использовать, приходится импортировать. Но поскольку программировать на Java бесполезно без многих средств, определенных в пакете jаva.lang, компилятор неявно импортирует его для всех программ. Это равнозначно наличию следующей строки кода в каждой из программ нa java: 

import java.lang.*;

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

При импорте пакета классам, не производным от классов из данного пакета в импортирующем коде, будут доступны только те элементы пакета, которые объявлены как рubliс.

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

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

Ресурсы: Герберт Шилдт. Java 8. Руководство для начинающих. Глава 9. Пакеты и интерфейсы



0 comments
Leave your comment: