Московский государственный университет имени М.В.Ломоносова
Опубликован: 03.10.2006 | Доступ: свободный | Студентов: 1224 / 79 | Длительность: 09:08:00
Специальности: Программист
Лекция 13:

Java: механизмы наследования, ссылочные типы данных, интерфейсы, вложенные классы

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

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

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

Реализация интерфейса всегда выполняется в классе, который использует данный интерфейс.

Один класс может реализовывать несколько интерфейсов, и один интерфейс может использоваться несколькими классами.

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

Объявление интерфейса может иметь следующее формальное описание:

МодификаторИнтерфейса  ИдентификаторИнтерфейса 
extends СписокНаследуемыхИнтерфейсов 
{ТелоИнтерфейса}

Самым простым примером объявления интерфейса может быть следующий код:

interface MyColors { 
    int RED = 1, YELLOW = 2, BLUE = 4; 
}

Интерфейс может иметь в качестве предков только интерфейсы.

Интерфейс может иметь модификаторы public и abstract. Язык Java подразумевает, что каждый интерфейс по умолчанию имеет модификатор abstract, который не рекомендуется указывать явно.

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

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

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

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

Метод интерфейса не может иметь модификаторов final или static.

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

Вложенные классы

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

Если требуется, чтобы класс ClassA наследовал все доступные методы, включая и protected -методы, двух классов (класса ClassB и класса ClassC ), то реализовать такую схему можно через вложенный класс.

Класс ClassA создается производным от класса ClassB. Это позволит всем экземплярам класса ClassA вызывать protected -методы класса ClassB.

В классе ClassA объявляется подкласс ClassFromC, производный от класса ClassC и переопределяющий все protected -методы класса ClassC, реализуя их как вызовы соответствующих методов из суперкласса.

При такой реализации экземпляр класса ClassA получает доступ к protected-методам двух различных классов - своего суперкласса и своего вложенного класса.

Абстрактные классы

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

< Лекция 12 || Лекция 13: 123 || Лекция 14 >