Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11271 / 455 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 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 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

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

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);