- •Интерфейсы
- •Цели занятия
- •Понятие интерфейса
- •Понятие интерфейса
- •Понятие интерфейса
- •Примеры интерфейсов
- •Примеры интерфейсов
- •Понятие интерфейса
- •Понятие интерфейса
- •Понятие интерфейса
- •Объявление интерфейса
- •Константы в интерфейсах
- •Константы в интерфейсах
- •Методы в интерфейсах
- •Наследование и сокрытие
- •Наследование и сокрытие
- •Наследование и сокрытие
- •Наследование и сокрытие
- •Наследование и сокрытие
- •Наследование, переопределение
- •Наследование, переопределение
- •Пустые интерфейсы
- •Абстрактный класс или
- •Литература
Объявление интерфейса
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 |