JavaRush /Курсы /Java Core /Абстрактные классы

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

Java Core
2 уровень , 5 лекция
Открыта

— Привет, Амиго! Новая интересная тема.

— Да сегодня просто день интересных тем!!

— Спасибо!

— Да не за что.

— Помнишь ситуацию, когда мы ввели базовый класс ChessItem для упрощения всех классов шахматных фигур?

— Да.

— Теперь представь, что у каждой фигуры есть метод, который занимается ее отрисовкой на экране. Вызываешь метод, и фигура сама себя рисует в своих текущих координатах. Удобно было бы вынести этот метод в базовый класс?

— Да. После того, что я узнал о полиморфизме, можно было бы вызывать метод отрисовки для всех фигур, независимо от их типа. Примерно так:

Пример
class ChessBoard {
    public void drawAllChessItems() {
        //добавляем фигуры в список
        ArrayList<ChessItem> items = new ArrayList<>();
        items.add(new King());
        items.add(new Queen());
        items.add(new Bishop());

        //рисуем их независимо от их типа.
        for (ChessItem item: items) {
            item.draw();
        }
    }
}

— Молодец. Именно так. А что бы отрисовал на экране метод draw самого класса ChessItem?

— Не знаю. Такой фигуры ведь в шахматах нет. Значит, и изображения у нее нет.

— Именно. Более того, создавать объекты типа ChessItem – не имеет смысла. Это не фигура из шахмат, всего лишь абстракция — класс, который мы сделали для удобства. Так работает абстракция из ООП: мы вынесли важные (общие для всех фигур) данные и методы в базовый класс, а их различия оставили в их классах.

Абстрактные классы - 1

Для такого случая в Java есть специальный тип классов – абстрактные классы. Вот четыре вещи, которые стоит помнить об абстрактных классах.

1) Абстрактный класс может содержать объявление метода без его реализации. Такой метод называется абстрактным.

Пример
 public abstract class ChessItem {
    public int x, y; //координаты
    private int value; // «ценность» фигуры

    public int getValue() //обычный метод, возвращает значение value {
        return value;
    }

    public abstract void draw(); //абстрактный метод. Реализация отсутствует.

}
3
Задача
Java Core, 2 уровень, 5 лекция
Недоступна
Набираем код Ӏ Java Core: 2 уровень, 5 лекция
Java Core: 2 уровень, 5 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

2) Абстрактный метод помечается специальным ключевым словом abstract.

Если в классе есть хоть один абстрактный метод, класс тоже помечается ключевым словом abstract.

3) Создавать объекты абстрактного класса нельзя. Такой код просто не скомпилируется.

Код на Java Описание
ChessItem item = new ChessItem();
item.draw();
Этот код не скомпилируется
ChessItem item = new Queen();
item.draw();
А так можно.

4) Если ты наследовал свой класс от абстрактного класса, то нужно переопределить все унаследованные абстрактные методы — написать для них реализацию. Иначе такой класс тоже придется объявить абстрактным. Если в классе есть хотя-бы один нереализованный метод, объявленный прямо в нем или унаследованный от класса-родителя, то класс считается абстрактным.

— А зачем это все нужно? Зачем нужны абстрактные классы? Разве нельзя вместо них использовать обычные? А вместо абстрактных методов просто писать две скобочки в качестве тела метода — {} ?

— Можно. Но эти ограничения сродни модификатору private. Мы специально запрещали с помощью private прямой доступ к данным, чтобы другие программисты и их классы пользовались только написанными нами public-методами.

То же и с абстрактным классом. Тот, кто написал этот класс, не хочет, чтобы создавались его объекты. Наоборот, он рассчитывает на то, чтобы от его абстрактного класса наследовались и переопределяли абстрактные методы.

— Все равно не понятно, зачем усложнять себе жизнь?

— Преимущество этого проявляется в больших проектах. Чем больше классов, тем чётче приходится очерчивать их роли. Ты увидишь преимущество этого, и уже в ближайшем будущем. Все через это проходят.

Комментарии (264)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
4 августа 2025
Like
Cloud Room Уровень 4
6 марта 2025
Я ощущаю себя Тайлером Дерденом, когда читаю такие диалоги
kekich119 Уровень 30
9 июня 2025
Есть такое хахаха
OUROBOROS Уровень 30
3 января 2025
Может, кому пригодится
FolFix Уровень 38
19 августа 2024
Где комиксыыыы
{Java_Shark} Уровень 36
16 июля 2024
++
Kiberdronik Уровень 32
9 марта 2024
Возможно моя подсказка окажется не совсем удачной, но если вам лень набирать код клавиши: ctrl + a & ctrl + c & ctrl + v помогут. Но лучше поставить прогу по типу соло на клавиатуре английская версия и кодить... месяц на русский шрифт и месяц на английский и будет вам счастье. ps прога соло не реклама есть другие но я пользовался ей...
Енот Уровень 51 Expert
11 марта 2024
ага, тоже ее прошел, только на русском, на англ на автомате стал набирать со временем) один из полезнейших навыков слепая печать) я когда учил, чтоб не было соблазна смотреть на клаву, достал все клавиши из нее, и в случайном порядке вставил их, вот это был хардкор.
Private Joker Уровень 36
15 марта 2024
что за прога соло, я шот не понял?
Kiberdronik Уровень 32
24 апреля 2024
программа обучения слепой печати
Dinar763 Уровень 23
18 июля 2024
старая прога - но самая лучшая мне кажется - Соло на клавиатуре) еще в детстве по ней учился
SashaCurry Уровень 30
14 августа 2024
Я учился на typerun. Это в самом начале Потом, когда смог вслепую набирать не просто слова, а целые текста, перешёл на monkeytype. До сих пор периодически на него захожу, чтоб размяться перед рабочем днём)
Петр Уровень 26
14 января 2024
В задании набираем код фигурные скобки расставлены в стиле языка C. В Java открывающую фигурную скобку ставят на той же строке, где и имя метода.
даня клава Уровень 25
19 февраля 2024
да и закрыть ее можно на той же строке)) только такой код,по моему мнению,будет сложно прочитать) но ради интереса решений в одну строку - запросто
Alex Уровень 28
2 января 2024
Все через это проходят..
Ильназ Аскаров Уровень 32
12 декабря 2023
Зачем нужны абстрактные классы если есть интерфейсы? в чем их разница? Оба предполагают, что от них будут наследоваться, нельзя создавать их копии и имеют абстрактные методы которые их наследники будут переопределять
Anonymous #3285315 Уровень 18
12 декабря 2023
Абстрактный класс отвечает за то как наш обьект будет выглядеть, выделяя его важные характеристики в контексте твоей задачи, а интерфейс описывает само поведение класса. В абстрактном есть поля и конструктор , в интерфейсах поля статик и файнал и нема конструкторов.
Anonymous #3285315 Уровень 18
9 февраля 2024
Объект абстрактного класса действительно создать нельзя, но конструктор в абстрактном классе есть
Vitalii Shevchenko Уровень 1
1 апреля 2025
Aбстрактні класи можуть мати конструктори! Вони потрібні, щоб ініціалізувати спільні дані для підкласів.
Anonymous cat Уровень 33 Expert
6 декабря 2023
fine?