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

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

Общая форма:

а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
Что именно не так?
Dmitry_K
Sep 2, 2022
К последнему комментарию - в классе FindAreas: 1. Тип массива должен быть Figure2[], а не Figure[] 2. Строку figures[0] = new Figure(10, 10); следует закомментировать, либо указать у объекта тип подкласса. Так как Figure - абстрактный класс.
Droni4
Sep 5, 2022
Rectangle
Droni4
Sep 5, 2022
В последнем примере, код правильный но не корректный, т.к. не соответствует описанию задачи. По описанию это должен быть абстрактный класс Figure2 и его наследники Rectangle2 и Triangle2, а показан пример где класс Figure не абстрактный и Rectangle и Triangle наследуются тоже не от абстрактного классса.
Droni4
Sep 5, 2022
Исходя из вывода и описания задачи и логике темы урока строки создания и инициализации элементов массива должны быть примерно такие: Figure2[] figures = new Figure2[3]; figures[0] = new Rectangle2(20, 10); figures[1] = new Rectangle2(10, 10); figures[2] = new Triangle2(10, 10);