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

Абстрактные методы – это методы у которых отсутствует реализация.

Общая форма:

аbstract тип имяМетода(списокПараметоров); 

Пример:

public abstract double area();

Абстрактные методы должны быть обязательно переопределены в подклассе.

Любой класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный. Для этого достаточно указать ключевое слово abstract перед ключевым словом class в начале объявления класса:

public abstract class Figure2 {
    … 
    public abstract double area();
}

У абстрактного класса в Java не может быть никаких объектов. Но абстрактные классы можно применять для создания ссылок на объекты. Например:

public abstract class Figure2 {

    ...
    public abstract double area();
    public static void main(String[] args) {
         // У абстрактного класса не может быть никаких объектов.
         // Figure2 figure1 = new Figure2();
         // Но абстрактные классы можно применять для создания ссылок на объекты.
	 Figure2 figure2 = new Rectangle();
    }
}

Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы.

Рассмотрим пример использования абстрактных классов и методов на примере класса Figure и его наследников Triangle и Rectangle, которые мы рассматривали в Переопределение методов. Класс Figure описывает абстрактную фигуру, для которой вычисление площади не имеет смысла, поэтому метод area() более  правильно сделать абстрактным.  

Абстрактные классы в Java фото

public abstract class Figure2 {
    double dim1;
    double dim2;

    public Figure2(double dim1, double dim2) {
        this.dim1 = dim1;
        this.dim2 = dim2;
    }

    public abstract double area();
}

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

public class Rectangle2 extends Figure2 {
    public Rectangle2(double dim1, double dim2) {
        super(dim1, dim2);
    }

    public double area() {
        System.out.println("B области четырехугольника.");
        return dim1 * dim2;
    }
}
public class Triangle2 extends Figure2 {
    public Triangle2(double dim1, double dim2) {
        super(dim1, dim2);
    }

    public double area() {
        System.out.println("B области треугольника.");
        return dim1 * dim2 / 2;
    }
}

У абстрактного класса не может быть объектов, но можно создать массив абстрактного класса, который будет содержать ссылки на объекты классов наследников: 

public class FindAreas2 {
    public static void main(String[] args) {
        Figure2[] figures = new Figure2[3];
        figures[0] = new Rectangle2(20, 10);
        //  figures[0] = new Figure2(10, 10);
        figures[1] = new Rectangle2(10, 10);
        figures[2] = new Triangle2(10, 10);
        for (Figure2 figure : figures) {
            figure.area();
        }
    }
}

Результат выполнения программы:

B области четырехугольника.
B области четырехугольника.
B области треугольника.
Read also:
Comments