Механизм пакетов позволяет группировать классы в соответствии с выполняемыми ими функциями. Чтобы понять, зачем в языке Java реализована поддержка пакетов, рассмотрим следующий пример:
import java.lang. *;
class Display
{
public static void main (String args [])
{
Calculations calc = new Calculations ();
System.out.println (calc.factorial (10));
}
}
class Calculations
{
int factorial (int a)
{
if (a ==1)
return 1;
else
return (a * factorial (a-1));
}
}
В отличие от предыдущего примера, данное приложение содержит два класса. Метод main (), определенный в классе Display, отображает данные, а factorial () — единственный метод, принадлежащий классу Calculations, вычисляет факториал целого числа.
Скомпилировав приложение и запустив его на выполнение, вы не увидите ничего особенного. Однако обратите внимание на содержимое текущего каталога. Если перед началом компиляции в нём был лишь файл Display.java, то теперь в нем находятся также файлы Display.class и Calculations.class.
Итак, в языке Java каждый класс располагается в отдельном файле.
После запуска приложения виртуальная машина Java сама находит файл Calculations.class и использует содержащийся в нём байтовый код для проведения вычислений. Это позволяет обойтись без этапа компоновки различных модулей.
Вспомните, как компилируются программы, написанные на языке C++. Код, который поддерживает объекты, используемые в программе, включается в состав исполняемого файла. Чтобы перенести C++-приложение на другой компьютер, необходимо скопировать весь исполняемый код, включая статически связанные библиотеки, — в противном случае приложение не будет работать. При использовании локальной сети такое копирование не вызывает затруднений, однако передать по Internet приложение объёмом в несколько мегабайт иногда бывает сложно.
Чтобы перенести на другой компьютер приложение, написанное на языке Java, надо передать значительно меньший объём кода. Необходимо скопировать лишь классы, отсутствующие на удаленной машине; обычно это именно те классы, которые определяют специфику написанного вами приложения. Малая загрузка линий связи при копировании программ — одна из особенностей, благодаря которым Java стал признанным «сетевым» языком.
Отсутствие редактирования связей — серьезное преимущество, однако в некоторых случаях оно может обернуться недостатком. Избежать путаницы в определениях классов позволяет механизм пакетов.
Первая строка каждого из приведенных выше исходных текстов содержала выражение
package math;
В результате все созданные классы были помещены в именованный пакет с именем math. Ваш коллега, используя подобную команду, может поместить созданный им класс в другой пакет
package stat;
Теперь полное имя класса, созданного вами, — math.Calculations, а имя класса, разработанного вашим сотрудником, — stat.Calculations.
Java поддерживает иерархию пакетов.