Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Java.doc
Скачиваний:
17
Добавлен:
07.09.2019
Размер:
569.34 Кб
Скачать

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

В некоторых случаях бывает необходимо отменить одно из свойств языка Java – переопределение методов при наследовании. Методы объявленные как final не могут быть переопределены. Это демонстрируется на следующем примере.

class A

{ final void fun()

{ }

. . .

}

class B extends A

{ void fun() // error: метод нельзя переопределять

{ }

. . .

}

Одним из достоинств final-методов является то, что компилятор может их «встраивать» в точку их вызова. Тем самым, сокращая время на их вызов. Встраиваться могут только final-методы. Т.к. эти методы не переопределяемы, то их вызов может быть организован на этапе компиляции – раннее связывание.

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

Для отмены наследования одного класса другим применяется еще одна форма использования слова final.

final class A

{ . . .

}

class B extends A // error: класс В не может наследоваться от final-класса

{ . . .

}

При этом все методы final-класса А неявно объявляются final-методами. Так же отметим, что абстрактный класс не может быть и final-классом, т.к. он обязательно должен быть определен в подклассе.

Класс Object

В Java имется один класс – Object, являющийся суперклассом для всех других классов. Таким образом ссылочная переменная типа Object может обращаться к объекту любого другого класса. Более того, так как массивы реализуются как и классы через ссылочную переменную, то переменная типа Object может также обращаться и к массиву.

Пакеты и интерфейсы Пакеты

Для того, чтобы имя разработанного класса не вступало в конфликт с такими же именами других классов в Java используются контейнеры для таких классов. Т.о. пакет – это контейнер для классов. Пакет используется для определения пространства имен классов разделенное на именованные области. Например, можно создать класс Shape, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть, если бы кто-нибудь создал класс с именем Shape. Пакеты - это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. Пакеты подчинены иерархии и явным образом импортируются в определения новых классов. У каждого файла  .java есть четыре одинаковых внутренних части. Ниже приведена общая форма исходного файла Java.

одиночный оператор package (необязательный)

любое количество операторов import (необязательны)

одиночное объявление открытого(public) класса

любое количество закрытых(private) классов пакета (необязательны)

Оператор package

Этот оператор первым может появиться в исходном файле Java. Он сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Сообщает транслятору, в каком пакете должны определяться содержащиеся в данном файле классы. Транслятор Java использует для хранения пакетов каталоги файловой системы. Например, объявленный оператором

package java.awt.image;

пакет должен храниться в каталоге

java\awt\image.

Если оператор package не указан, классы попадают в безымянное пространство имен, используемое по умолчанию.

Каталог, который транслятор Java будет рассматривать, как корневой для иерархии пакетов, можно задавать с помощью переменной окружения СLASSPATH. С помощью этой переменной можно задать несколько корневых каталогов для иерархии пакетов (через ; как в обычном PATH).

Пакеты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах.