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

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

Общая форма:

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

Пример:

public abstract double calculateArea();

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

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

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

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

public abstract class Figure2 {

    ...
    public abstract double calculateArea();

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

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

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

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

public abstract class Figure2 {
    double dimension1;
    double dimension2;

    public Figure2(double dimension1, double dimension2) {
        this.dimension1 = dimension1;
        this.dimension2 = dimension2;
    }

    public abstract double calculateArea();
}

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

public class Rectangle2 extends Figure2 {
    public Rectangle2(double dimension1, double dimension2) {
        super(dimension1, dimension2);
    }

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

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

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

public class FindAreas {
    public static void main(String[] args) {
        Figure[] figures = new Figure[3];
        figures[0] = new Figure(10, 10);
        figures[1] = new Rectangle(10, 10);
        figures[2] = new Triangle(10, 10);
        for (Figure figure : figures) {
            double area = figure.caclulateArea();
            System.out.println(area);
        }
    }
}

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

B области четырехугольника.
200.0
B области четырехугольника.
100.0
B области треугольника.
50.0
Read also:
Trustpilot
Trustpilot
Comments
Evgeny
May 5, 2021
123
Evgeny
May 5, 2021
В последнем блоке неверный код.
sysadmin
May 6, 2021
Что именно не так?