Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абстрактные классы интерфейсы внутренние классы...doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
204.29 Кб
Скачать

Использование final для отказа от переопределения

Хотя переопределение методов — одно из наиболее мощных свойств Java, может появиться потребность отказаться от него. Чтобы отменить переопре­деление метода, укажите модификатор final в начале его объявления. Мето­ды, объявленные как final, не могут переопределяться.

Например:

class A {

final void meth() {

System.out.println("Это метод final.");

}

}

class В extends A {

Void meth() { // ошибка! Нельзя переопределять.

System.out.println("Ошибка!");

}

}

Поскольку meth о объявлен как final, он не может быть переопределен в классе B. Если вы попытаетесь сделать это, то получите ошибку во время компиляции.

Использование final для отмены наследования

Иногда нужно разорвать наследственную связь классов (отменить наследо­вание одного класса другим). Чтобы сделать это, предварите объявление класса ключевым словом final, что позволит неявно объявить и все его методы. Заметим, что недопустимо объявлять класс одновременно как abstract и final, т. к. абстрактный класс неполон сам по себе и полагается на свои подклассы, чтобы обеспечить полную реализацию. Пример final-класса:

final class А {

// ... }

// Следующий класс незаконный.

class В extends А { //ОШИБКА! В не может быть подклассом А

// .. . }

Комментарий здесь означает, что B не может наследовать A, т. к. A объявлен как final.

Пакеты

В предыдущих примерах имя каждого класса выбиралось из од­ного и того же пространства имен и поэтому для каждого класса нужно было использовать уникальное имя. Java обеспечивает специальный ме­ханизм для разделения пространства имен классов на управляемые части. Этот механизм называется "пакеты" (packages). Пакет является механизмом как именования, так и управления видимостью. Вы можете определять внутри пакета классы, которые не доступны кодам вне этого пакета. Вы можете также определять члены класса, доступные только другим членам того же самого пакета.

Определение пакета

Для создания пакета необходимо включить оператор package в начало ис­ходного файла Java. Любые классы, объявленные в пределах этого файла, бу­дут принадлежать указанному пакету. Оператор package определяет про­странство имен, в котором сохраняются классы. Если вы опускаете инст­рукцию package, имена класса помещаются в пакет по умолчанию (default package), который не имеет никакого имени.

Чтобы хранить пакеты, Java использует каталоги файловой системы. На­пример, class-файлы для любых классов, которые вы объявляете как часть пакета MyPackage, должны быть сохранены в каталоге с именем MyPackage. Регистр существенен, и имя каталога должно точно соответст­вовать имени пакета. Одну и ту же package-инструкцию могут включать несколько файлов. Она указывает, какому пакету принадлежат классы, определенные в файле. Нельзя переимено­вывать пакет без переименования каталога, в котором хранятся классы.

Пакеты добавляют еще одно измерение к управлению доступом. Из-за взаимодейст­вия между классами и пакетами, Java адресует четыре категории видимости для элементов класса:

  • подклассы в том же пакете;

  • классы не являющиеся подклассами в том же пакете;

  • подклассы в различных пакетах;

  • классы, которые не находятся в том же пакете и не являются подклассами.

Большое разнообразие уровней защиты доступа для этих категорий обеспе­чивают три спецификатора доступа: private, public и protected.

Доступ к членам классов

Private

Без модификатора

Protected

Public

Тот же класс

Yes

Yes

Yes

Yes

Подкласс того же пакета

No

Yes

Yes

Yes

Класс не являющийся подклассом того же пакета

No

Yes

Yes

Yes

Подкласс из другого пакета

No

No

Yes

Yes

Класс не являющийся подклассом из другого пакета

No

No

No

Yes

Таким образом: все, объявленное как public, мо­жет быть доступно отовсюду. Все, объявленное как private, не может быть видимо извне своего класса. Когда элемент не имеет явных спецификаций доступа, он видим в подклассах, также как в других классах в том же самом пакете. Это — доступ, заданный по умолчанию. Если вы хотите позволить элементу быть видимым извне вашего текущего пакета, но только в классах, являющихся прямыми подклассами вашего класса, то объявите этот элемент protected.

Табл. применяется только к членам классов. Сам класс имеет лишь два возможных уровня доступа — по умолчанию и общий (public). Когда класс объявлен как public, он доступен из любых других кодов. Если класс имеет доступ по умолчанию, то к нему возможен доступ только из кодов того же пакета.

Чтобы обеспечить видимость некото­рых классов или полных пакетов Java, используется оператор import.

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

Все стандартные классы Java хранятся в пакете с именем Java. Основные функции языка размещаются во внутреннем пакете Java с именем java.lang. Обычно нужно импортировать каждый пакет или класс, который вы хотите использовать, но, так как Java бесполезен без многих функцио­нальных возможностей java.lang, указанный пакет неявно импортируется компилятором для всех программ.