Что делает модификатор abstract в Java?

Ответ

Модификатор abstract в Java используется для объявления абстрактных классов и абстрактных методов, которые задают каркас без полной реализации.

1. Абстрактный класс

  • Нельзя создать экземпляр с помощью new.
  • Может содержать как абстрактные методы (без тела), так и обычные методы с реализацией.
  • Предназначен для наследования.
abstract class Shape {
    private String color;

    // Обычный метод
    public String getColor() { return color; }

    // Абстрактный метод (без реализации)
    public abstract double calculateArea();
}

2. Абстрактный метод

  • Не имеет тела (фигурных скобок {}), заканчивается точкой с запятой.
  • Обязан быть переопределён в первом неабстрактном классе-наследнике.
  • Может находиться только в абстрактном классе или интерфейсе.
class Circle extends Shape {
    private double radius;

    @Override
    public double calculateArea() { // Реализация абстрактного метода
        return Math.PI * radius * radius;
    }
}

Зачем это нужно? Для создания общего контракта (набора методов), который производные классы обязаны выполнить, обеспечивая полиморфизм и единую точку взаимодействия.

Ответ 18+ 🔞

Да ты посмотри, какой народ безмозглый, блядь! Сидят, в Java ковыряются, а про abstract нихуя не понимают. Ну ладно, объясняю, как для распиздяев, чтобы даже кот, сука, собака понял.

Вот представь, есть у тебя класс Shape — типа «фигура». И что это за фигура? Хуй его знает! Круг? Квадрат? Треугольник? Пизда с ушами? Непонятно! Так вот, чтобы тебя, такого умного, не пиздец как обосрали, когда ты попробуешь new Shape() сделать, язык и придумал модификатор abstract.

Абстрактный класс — это как чертёж, блядь, в рот меня чих-пых! На нём написано «сделай дом», но кирпичей нет, цемента нет, только идея, блядь. Создать его экземпляр? Да ни хуя! new Shape() — это пиздец, компилятор тебе такую ошибку впендюрит, что мало не покажется. Он для наследования, понимаешь? Чтобы от него другие классы плодились.

abstract class Shape {
    private String color;

    // Ну тут всё понятно, обычный метод, можно трогать
    public String getColor() { return color; }

    // А вот это, сука, абстрактный метод! Тела нет, одна точка с запятой!
    // Как будто крикнул: «Считай площадь!» — а как считать, нихуя не сказал.
    public abstract double calculateArea();
}

Абстрактный метод — это вообще пиздопроебибна! Объявил — и хуй с горы. Никакой реализации, только имя и крик души. Но вся хуйня в том, что первый неабстрактный наследник обязан его переопределить. Не переопределишь? Компилятор тебя нахуй пошлёт, и будет прав, пидарас шерстяной.

class Circle extends Shape {
    private double radius;

    @Override
    public double calculateArea() { // А вот тут уже, блядь, работай!
        return Math.PI * radius * radius; // Реализация, ёпта!
    }
}

А зачем этот весь цирк, блядь? А затем, чувак, чтобы был порядок! Чтобы ты мог в коде написать Shape myShape = new Circle(); и вызывать myShape.calculateArea(), не забивая хуй, какая там конкретно фигура. Это и есть полиморфизм, блядь — единая точка входа, а внутри может быть что угодно: круг, квадрат или твоя жизнь, которая тоже, сука, по площади ноль.

Короче, abstract — это когда ты говоришь: «Вот вам, падлы, каркас! А дальше сами разбирайтесь, как это реализовать, я не мамка ваша». И все довольны, и код не разъёбывается.