Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Интерфейсы и Наследование
Раздел: Наследование
Абстрактные Методы и Классы
Домашняя страница > Изучение Языка Java > Интерфейсы и Наследование

Абстрактные Методы и Классы

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

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

abstract void moveTo(double deltaX, double deltaY);

Если class включает абстрактные методы, сам class должен быть объявлен abstract, как в:

public abstract class GraphicObject {
   // declare fields
   // declare non-abstract methods
   abstract void draw();
}

Когда абстрактный class разделяется на подклассы, подкласс обычно обеспечивает реализации для всех абстрактных методов в его родительском class. Однако, если это не делает, подкласс должен также быть объявлен abstract.


Отметьте: Все методы в интерфейсе (см. Interfaces раздел), неявно абстрактны, таким образом, abstract модификатор не используется с методами интерфейса (это могло быть — это только не необходимо).

Абстрактные классы против Интерфейсов

В отличие от интерфейсов, абстрактные классы могут содержать поля, которые не являются static и final, и они могут содержать реализованные методы. Такие абстрактные классы подобны интерфейсам, за исключением того, что они обеспечивают частичную реализацию, предоставляя подклассам право завершить реализацию. Если абстрактный class содержит только абстрактные объявления метода, он должен быть объявлен как интерфейс вместо этого.

Многократные интерфейсы могут быть реализованы классами где угодно в иерархии class, связываются ли они с друг другом всегда. Думать Comparable или Cloneable, например.

В сравнении абстрактные классы обычно разделяются на подклассы, чтобы совместно использовать части реализации. Единственный абстрактный class разделяется на подклассы подобными классами, которые имеют много общего (реализованные части абстрактного class), но также и имеют некоторые различия (абстрактные методы).

Пример Абстрактного класса

В объектно-ориентированном приложении рисунка можно потянуть круги, прямоугольники, строки, Кривые Безье, и много других графических объектов. Эти объекты у всех есть определенные состояния (например: позиция, ориентация, цвет строки, цвет заливки) и поведения (например: moveTo, поверните, измените размеры, потяните), вместе. Некоторые из этих состояний и поведений являются тем же самым для всех графических объектов — например: позиция, цвет заливки, и moveTo. Другие требуют различных реализаций — например, изменяют размеры или тянут. Все GraphicObjects должен знать, как потянуть или изменить размеры себя; они только отличаются по тому, как они делают это. Это - совершенная ситуация для абстрактного суперкласса. Можно использовать в своих интересах общие черты и объявить, что все графические объекты наследовались от того же самого абстрактного родительского объекта — например, GraphicObject, как показано в следующем числе.

Прямоугольник классов, Строка, Bezier, и Круг наследовались от GraphicObject

Прямоугольник классов, Строка, Bezier, и Круг наследовались от GraphicObject

Во-первых, Вы объявляете абстрактный class, GraphicObject, обеспечить задействованные переменные и методы, которые полностью совместно используются всеми подклассами, такими как текущая позиция и moveTo метод. GraphicObject также объявляет абстрактные методы для методов, такой как draw или resize, это должно быть реализовано всеми подклассами, но должно быть реализовано по-разному. GraphicObject class может выглядеть примерно так:

abstract class GraphicObject {
    int x, y;
    ...
    void moveTo(int newX, int newY) {
        ...
    }
    abstract void draw();
    abstract void resize();
}

Каждый неабстрактный подкласс GraphicObject, такой как Circle и Rectangle, должен обеспечить реализации для draw и resize методы:

class Circle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}

Когда Абстрактный класс Реализует Интерфейс

В разделе по Interfaces, было отмечено, что class, который реализует интерфейс, должен реализовать все методы интерфейса. Возможно, однако, определить class, который не реализует все методы интерфейса, при условии, что class, как объявляют, abstract. Например,

abstract class X implements Y {
  // implements all but one method of Y
}

class XX extends X {
  // implements the remaining method in Y
}

В этом случае, class X должен быть abstract потому что это не полностью реализует Y, но class XX действительно, фактически, реализует Y.

Элементы класса

Абстрактный class может иметь static поля и static методы. Можно использовать эти статические элементы со ссылкой class — например, AbstractClass.staticMethod()— поскольку Вы были бы с любым другим class.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Запись Заключительных Классов и Методов
Следующая страница: Сводка Наследования