Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Haulmont-презентации Java / Haulmont. java_se_3.2.ppt
Скачиваний:
29
Добавлен:
16.03.2015
Размер:
660.99 Кб
Скачать

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

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

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

методы

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

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

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

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

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

12• В состав интерфейса могут быть включены объявления именованных констант

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

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

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

сути интерфейса

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

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

13Пример 4 interface Verbose {

int SILENT

= 0; // Безмолвный

int TERSE

= 1; // Немногословный

int NORM

= 2; // Нормальный

int VERVOSE = 3; // Многоречивый void setVerbosity(int level);

int getVerbosity(); }

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

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

рассмотрены далее

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

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

14• Методы, объявляемые в составе интерфейса, неявно получают признак abstract, поскольку не содержат (и не

могут содержать) блок тела

В соответствии с принятым соглашением модификатор abstract в объявлении метода не указывается

Все методы неявно помечаются признаком public

В соответствии с принятым соглашением модификатор public в объявлении метода не указывается

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

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

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

 

 

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

15

 

интерфейсов

public. Интерфейс public открыт для доступа извне. Как и в

 

 

 

случае с объявлением классов, модификатор public по

 

 

отношению к интерфейсу разрешается использовать только

 

 

тогда, когда интерфейс определён в файле с тем же именем.

 

 

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

 

 

признак доступа уровня пакета

 

abstract. Каждый интерфейс по определению абстрактен,

 

 

поскольку все его методы не содержат блоков реализации. И

 

 

вновь, в соответствии с принятым соглашением, модификатор

 

 

abstract в объявлении интерфейса опускается

 

strictfp. Объявление интерфейса, помеченного признаком

 

 

strictfp, предполагает, что все операции с плавающей запятой,

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

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

 

 

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

16

Интерфейсы допускают расширение; в этом случае в объявлении

 

 

 

производного интерфейса используется служебное слово extends

 

Интерфейсы, в отличие от классов, способны расширять

 

 

более одного

 

 

Пример 5

 

 

public interface SerializableRunnable extends java.io.Serializable,

 

 

Runnable

 

 

{

 

 

// …

 

 

}

 

Это означает, что все методы и константы, определённые в

 

 

каждом унаследованном интерфейсе, становятся, наряду с

 

 

собственными методами и константами, частью контракта нового

 

 

интерфейса SerializableRunnable

 

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

 

 

новому интерфейсу, который, в свою очередь, является

 

 

производным, или расширенным, интерфейсом относительно

 

 

базовых

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Наследование и сокрытие

констант

17• Производный интерфейс наследует все константы, объявленные в базовых интерфейсах

Если в производном интерфейсе объявлена константа с тем же именем, что и унаследованная, то, независимо от их типов, новая константа «скрывает» старую

Те же правила справедливы и в отношении унаследованных полей классов

Ссылка на константу посредством простого имени в контексте производного интерфейса или класса, который реализует этот интерфейс, означает обращение к константе, принадлежащей производному, а не базовому, интерфейсу

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Наследование и сокрытие

констант

18• Константа, унаследованная от базового интерфейса, всё ещё доступна, если при ссылке на неё указывать полное имя, т.е. название интерфейса, сопровождаемое оператором точки и идентификатором самой константы

Точно так же обычно выполняется обращение к статическим членам классов

Пример 6 interface X {

int val = 1;

}

interface Y extends X { int val = 2;

int sum = val + X.val;

}

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Наследование и сокрытие

констант

19• Если интерфейс Y реализуется каким-либо классом, константы интерфейса Y с точки

зрения этого класса будут выглядеть как члены класса

Например, в контексте класса, объявление которого выглядит как

class Z implements Y {}

вполне допустимо следующее выражение:

System.out.println("Z.val=" + Z.val + "Z.sum=" + Z.sum);

Но при этом отсутствует возможность обращения посредством Z к X.val

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Наследование и сокрытие

констант

20• Однако, если ссылка на объект Z существует, адресовать X.val удаётся с помощью оператора преобразования типов:

Z z = new Z();

System.out.println("z.val=" + z.val + ", ((Y)z).val=" + ((Y)z).val +

", ((X)z).val=" + ((X)z).val);

• Результат работы кода будет выглядеть так: z.val=2, ((Y)z).val=2, ((X)z).val=1

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

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

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Соседние файлы в папке Haulmont-презентации Java