На этом шаге мы поговорим про пакеты
Язык Java позволяет объединять классы в наборы, называемые пакетами. Пакеты облегчают организацию работы и позволяют отделить классы, созданные одним разработчиком, от классов, разработанных другими. Стандартная библиотека Java содержит большое количество пакетов, в том числе java.lang, java.util, java.net и так далее. Стандартные пакеты Java представляют собой иерархические структуры. Подобно каталогам на диске компьютера, пакеты могут быть вложены один в другой.
Пакеты служат в основном для обеспечения однозначности имен классов. Чтобы обеспечить абсолютную однозначность имени пакета, рекомендуется использовать доменное имя компании в Интернете, записанное в обратном порадке. В составе пакета можно создавать подпакеты и использовать их в разных проектах. Так, например, можно использовать такое название пакета: ru.kgsu.it.
Класс может использовать все классы из собственного пакета и все открытые кдассы из других пакетов. Доступ к классам из других пакетов можно получить двумя способами:
java.util.Date today = new java.util.Date();
Очевидно, что этот способ очень трудоемок и неудобен.
import java.util.*;
Отдельный класс можно также импортировать из пакета следующим образом:
import java.util.Date;
Импортировать все классы проще. На объем кода это не оказывает никакого влияния. Но если указать импортируемый класс явным образом, то читающему исходный код программы станет ясно, какие именно классы будут в ней использоваться.
Единственный случай, когда следует обратить особое внимание на пакет, возникает при конфликте имен. Например, оба пакета, java.util и java.sql, содержат класс Date. Допустим, разрабатывается программа, в которой оба эти пакета импортируются следующим образом:
import java.util.*; import java.sql.*;
Если теперь возпользоваться классом Date, возникнет ошибка компиляции. Компилятор не в состоянии определить, какой именно класс Date требуется в программе. Разрешить это затруднение можно, добавив конкретный оператор import следующий образом:
import java.util.*; import java.sql.*; import java.util.Date;
Если в программе нужны оба класса, то в этом случае нужно указать полное имя пакета перед именем каждого класса, как это показано ниже:
java.util.Date deadline = new java.util.Date(); java.sql.Date today = new java.sql.Date();
Обнаружение классов в пакетах является задачей компилятора. В байт-кодах, находящихся в файлах классов, всегда содержатся полные имена пакетов.
Чтобы ввести класс в пакет, следует указать имя пакета в начале исходного файла перед определением класса. Например, исходный файл Employee.java класса Employee можно было бы начать следующим образом:
package ru.kgsu.it; public class Employee { ... }
Если оператор package не указан, то классы, описанные в этом файле, вводятся в пакет по умолчанию. У пакета по умолчанию нет имени. Все рассмотренные ранее примеры принадлежали пакету по умолчанию.
Пакеты следует размещать в подкаталоге, путь к которому соответствует полному имени пакета. Компилятор размещает файлы классов в той же самой структуре каталогов.
На следующем шаге мы начнем говорить об наследовании