Конфликты именования

Импортирование пакетов

Существует ряд способов доступа к классам в пакетах, основным из которых является импортирование пакета в начале программ:

import ИмяПакета .*

или

import ИмяПакета.ИмяКлассаПакета

В этом случае импортирование просто должно предшествовать всем другим строка программы. Например:

import java.applet.*

import java.awt.*

import java.net.URL

При этом импортируется три пакета (если точнее, то открытые - public - классы четырех пакетов) с использованием двух способов. В первых двух строках программы использовалась (*), чтобы указать на возможность доступа ко всем открытым классам в пакете (тут нужно отметить, что классы подпакетов импортируются отдельно, с указанием отдельного оператора import). В последней строке явно установлено имя открытого класса для импортирования.

Надо заметить, что несмотря на то, что в первых двух строках указывается импортировать все классы пакета, на самом деле импортируются только классы, которые используются в программе; язык Java компонует классы, только если они действительно используются.

После того, как пакет импортирован, классы можно использовать просто по именам, без указания на принадлежность тому или иному пакету, например:

ИмяКлассаПакета Obj=new ИмяКлассаПакета(<Параметры>);

При использовании класса из пакета необходимо или импортировать пакет, частью которого он является, или сослаться на него в программе, как это описано ниже. Однако нет необходимости беспокоиться об импортировании пакета java.lang, так как эти классы - базовые классы Java и автоматически импортируются независимо от того, заданы они или нет.

Явные ссылки на классы пакетов

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

ИмяПакета.ИмяКласса Obj=new ИмяПакета.ИмяКласса(Параметры);

Способ явной ссылки на класс из пакета более удобен для чтения и понимания, откуда появился используемый класс, чем метод предложения импорта пакета, но менее удобен для кодирования, так как ссылка получается достаточно длинной.

Одним из достоинств явной ссылки на классы пакетов, помимо ясности самого текста программы, является то, что при этом имена классов не конфликтуют (что возможно при использовании предложения импорта).

Если программа импортирует два пакета и в каждом объявлены классы с одинаковыми именами, то непонятно, к примеру, по классу из какого пакета будет создаваться экземпляр класса. Это определить невозможно, поэтому компилятор выдаст ошибку и прервет компиляцию. Однако можно предотвратить этот потенциальный конфликт с помощью явного объявления имени пакета вместе с именем классов.