Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Java .pdf
Скачиваний:
118
Добавлен:
16.03.2015
Размер:
1.32 Mб
Скачать

Если необходимо интерпретировать obj как объект класса Body, следует применить соответствующий оператор преобразования типов.

Существует, правда, единственное исключение из этого правила: ссылку на любой интерфейс позволяется трактовать как ссылку на объект класса Object, поскольку Object – это базовый класс по отношению ко всем классам, поэтому его методы есть у любого объекта (или, говоря иначе, его контракту удовлетворяет любой объект). Поэтому следующее выражение вполне допустимо:

String desc = obj.toString();

Здесь ссылка на интерфейсный тип Comparable неявно преобразуется в ссылку на тип Object.

5.2Объявление интерфейса

Вобъявлении интерфейса содержится служебное слово interface, за которым следует наименование интерфейса и перечень его членов, заключенный в фигурные скобки.

Всоставеинтерфейса могутприсутствоватьчленытрёх категорий:

константы (поля);

методы;

вложенные классы и интерфейсы.

Все члены интерфейса по умолчанию обладают признаком

public, но модификатор public принято опускать. Применение других модификаторов доступа по отношению к членам интерфейса лишено особого смысла.

5.3Константы в интерфейсах

Всостав интерфейса могут быть включены объявления именованных констант. Такие константы определяются как поля, но им неявно присваиваются признаки public, static и final – и вновь, по традиции, соответствующие модификаторы принято

164

не указывать. Поля должны быть снабжены соответствующими инициализаторами – использование полей с отложенной инициализацией (blank final) не разрешается.

Поскольку в объявлении интерфейса отсутствует какой-либо код реализации, здесь запрещено объявление «нормальных» полей – в противном случае они послужили бы частью контракта интерфейса, которая «диктовала» бы производным классам те или иные правила реализации, а это противоречит самой сути интерфейса. Тем не менее, в интерфейсах позволено определять именованные константы, поскольку подчас они бывают весьма полезны при проектировании типов. Например, объявление интерфейса, описывающего возможные уровни красноречия человека, могло бы выглядеть так (пример 73).

Пример 73. Константы в интерфейсах interface Verbose {

int SILENT = 0; // Безмолвный int TERSE = 1; // Немногословный int NORM = 2; // Нормальный

int VERVOSE = 3; // Многоречивый

void setVerbosity(int level); int getVerbosity();

}

В метод setVerbosity() вместо «безмолвных» чисел удобнее передавать «красноречивые» константы SILENT, TERSE, NORM или VERVOSE, смысл которых определён в самих их названиях.

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

165

5.4 Методы в интерфейсах

Методы, объявляемые в составе интерфейса, неявно получают признак abstract, поскольку не содержат (и не могут содержать) блок тела. По этой причине блок тела в объявлении заменяется символом точки с запятой. В соответствии с принятым соглашением модификатор abstract в объявлении метода не указывается.

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

Вобъявлениях методов нельзя употреблять модификаторы, имеющие отношение к особенностям реализации – такие как native, synchronized или strictfp – поскольку интерфейс по определению не способен регламентировать правила реализации.

Методы запрещено помечать модификатором final, так как в их объявлениях вообще отсутствуют какие-либо блоки реализации, которые можно было бы трактовать как завершённые.

Кроме того, методы интерфейсов не способны быть статическими, поскольку модификаторы static и abstract нельзя использовать одновременно. Разумеется, внутри объявлений классов, реализующих интерфейс, те же (переопределённые) методы могут быть снабжены любыми подходящими модификаторами.

5.5Модификаторы в объявлениях интерфейсов

Вобъявлении интерфейсов разрешается использовать следующие модификаторы.

public. Публичный интерфейс открыт для доступа извне. Как и в случае с объявлением классов, модификатор public по отношению к интерфейсу разрешается использовать только тогда, когда интерфейс описан в файле с тем же именем. При

166

отсутствии этого модификатора, интерфейс получает признак доступа уровня пакета.

abstract. Каждый интерфейс по определению абстрактен, поскольку все его методы не содержат блоков реализации. И вновь, в соответствии с принятым соглашением, модификатор abstract в объявлении интерфейса опускается.

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

5.6 Расширение интерфейсов

Для интерфейсов также допустимо наследование, выражающееся в наследовании типа (без реализации). Говорят, что интерфейсы допускают расширение; в этом случае в объявлении производного интерфейса используется служебное слово extends. Интерфейсы, в отличие от классов, способны расширять более одного интерфейса (пример 74).

Пример 74. Расширение интерфейсов

public interface SerializableRunnable

extends java.io.Serializable, Runnable {

// ...

}

Интерфейс SerializableRunnable одновременно наследует от интерфейсов java.io.Serializable и Runnable. Это означает, что все методы и константы, определённые в каждом

167

Соседние файлы в предмете Программирование на Java