Элементы объектной модели Java: абстрактный класс, интерфейс

Главная мысль абстрактного класса заключена в следующем тезисе: иногда требуются не готовые классы, а в «сыром» виде. Такие заготовки нельзя прямо использовать (создавать экземпляры).

Что такое в Java абстрактный класс

Рассмотрим другой пример. Есть в Java абстрактный класс Calendar в пакете Java.util. Он не реализует конкретный календарь, которым пользуются, например, в Западной и Восточной Европе, Китае, Северной Корее, Таиланде и т. д. Но в нем есть много полезных функций, например, прибавление нескольких дней к конкретной дате: эти функции требуются для любой реализации календаря. Нельзя породить экземпляр от абстрактного класса.

Абстрактные классы, абстрактные методы Java

Допустим, нужно разработать несколько графических элементов, например, геометрических фигур: круг, прямоугольник, звезда и т. д. И существует контейнер, который их отрисовывает. У каждой компоненты внешний вид разный, поэтому соответствующий метод (пусть он называется paint) реализован по-разному. Однако у каждой компоненты есть много общих черт: фигуры должны быть вписаны в прямоугольник, могут иметь цвет, быть видимыми и невидимыми и т. д. То есть нужно создать родительский класс для всех этих фигур, где каждая компонента будет наследовать общие свойства.

Но как же метод paint? Ведь у родительского класса нет визуального представления. Если объявить метод paint в каждом классе независимо, надо будет анализировать, какая компонента обрабатывается, и затем выполнять приведение типа. Поэтому метод надо объявить абстрактным в родительском классе: задать заголовок метода без тела. А тело каждый производный класс опишет свое. В Java абстрактный класс может заключать абстрактные методы.

Если у класса имеются абстрактные методы, то класс является абстрактным. Перед словом class ставится ключевое слово abstract, в заголовке метода – тоже. После заголовка такого метода нужно ставить точку с запятой. В Java абстрактный класс не может порождать экземпляры. Если мы хотим запретить их создание, даже если у класса нет абстрактных методов, то класс можно объявить абстрактным. Но если у класса имеется хотя бы один абстрактный метод, то класс должен быть абстрактным. Нельзя, чтобы класс был и abstract, и final, и метод тоже. Метод не может быть abstract, private, static, native. Чтобы классы-наследники можно было объявлять неабстрактными и создавать их экземпляры, они должны реализовать все абстрактные методы родителя. Сам класс может использовать свои абстрактные методы.

Пример:

  • abstract class AClass {
  • public abstract void method (int a);
  • }
  • class BClass extends AClass {
  • public void method (int a) {
  • // тело
  • }

Допускаются переменные типа абстрактный класс. Они могут ссылаться на неабстрактного потомка этого класса или иметь значение null.

Интерфейсы в Java – альтернатива множественному наследованию

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

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

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

Оно начинается с заголовка и сначала может идти ключевое слово public, затем - слово interface. Потом может идти слово extends и перечисление интерфейсов, от которых наследуется данный. Здесь не допускается повторений, а также невозможно, чтобы отношение наследования образовывало циклическую зависимость. Затем идет тело интерфейса, заключенное в фигурные скобки. В теле интерфейса объявляются элементы: поля-константы и абстрактные методы. Все поля являются public final static - все эти модификаторы не обязательны. Все методы считаются public abstract - эти модификаторы тоже можно указать. Теперь вполне достаточно сказано про отличие абстрактного класса от интерфейса Java.

  • public interface AI extends B, C, D {
  • // тело
  • }

Чтобы объявить класс наследником интерфейса, надо воспользоваться ключевым словом implements:

  • class AClass implements BI, CI, DI {}

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

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

В этой статье мы рассмотрели некоторые элементы объектной модели Java – абстрактные классы, абстрактные методы, интерфейсы.

Комментарии