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

Открыта

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

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

— Спасибо!

— Да не за что.

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

— Да.

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

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

Пример
class ChessBoard
{
  public void drawAllChessItems()
  {
  //добавляем фигуры в список
  ArrayList 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-методами.

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

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

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

Комментарии (196)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Anonymous #2491313
33 уровень
28 января, 18:57
Почему здесь тупо повторение первого части?
vled
30 уровень, Москва
8 февраля, 09:23
тоже задаюсь таким вопросом
Olexandr Dombrovskyi
25 уровень, Киев
28 января, 11:40
Когда на работу можно уже устраиваться?:)
Vigdan Al-Maamary
15 уровень, Санкт-Петербург
15 февраля, 10:39
😂😂
Roman Grand
22 уровень, Новосибирск
13 марта, 17:30
после 7го-8го уровня надо было 😂, когда думал, что ты уже ого-го какой знаток/специалист java... а теперь уже поздно, так как теперь понимаешь, что ещё ничего толком не знаешь и до необходимых объёмов знаний ещё топать... и топать... и топать)))
Карбофос Огарин
13 уровень, Санкт-Петербург
3 апреля, 12:12
Тут один человек писал, что за 3 месяца дошёл до 13 уровня и устроился на работу джуном
Александр Работает в поиске работы
вчера, 18:09
пишут много чего. поди попробуй, и понимаешь какие реалии...
Anonymous #2297535
22 уровень, Северодвинск
17 января, 16:02
Все эти шахматы, коты и собаки до добра не доведут. Прихожу к мысли что надо брать чужой код и анализировать его. Можно изучать внутренности Java API. Там много всяких приколов)
Карбофос Огарин
13 уровень, Санкт-Петербург
3 апреля, 12:13
Тоже есть такие мысли, думаю после 12 уровня уйти с JR и копаться в чужом коде, писать свой проектик
Anonymous #2489173
28 уровень
29 декабря 2020, 03:08
ну были ж уже абстрактные классы, даже картинка с машинами та же вроде
Veygard
22 уровень, Москва
16 декабря 2020, 11:56
Заметки из Head-First-Java:
Руслан Асаев
14 уровень, Уфа
13 декабря 2020, 04:44
Амиго просто красавчик, не то что я...
Vsevolod
13 уровень, Москва
12 декабря 2020, 04:02
ArrayList items = new ArrayList();
Что это означает? Почему не указан тип данных в списке?
Anton Trapeznikov
28 уровень, Минск
15 декабря 2020, 20:22
тип данных будет Object по умолчанию
Vsevolod
13 уровень, Москва
16 декабря 2020, 01:33
Спасибо. Но удивлён, что я единственный, кто об этом спросил
Алексей Кремнёв QA Quality Engineer в Performance Lab
17 декабря 2020, 18:28
Так ведь это не массив из примитивов определенного типа, ArrayList - это реализация интерфейса List, то бишь разновидность коллекций. И держать в себе он может разные типы данных, например так всё будет работать:
ASY
17 уровень
15 февраля, 14:00
Тип данных там скорее всего один и по умолчанию он Object.
Карбофос Огарин
13 уровень, Санкт-Петербург
3 апреля, 12:15
по факту это raw type
Айбек
22 уровень, Бишкек
2 декабря 2020, 16:55
yне понимаю зачем нужны методы где внутри нет никакой реализации
Oleg Latysh Backend Developer в Askona
3 декабря 2020, 21:36
Этим ты обязываешь того кто будет наследоваться от этого класса реализовать эти методы.
Александр СМИРНОВ
13 уровень, Самара
1 декабря 2020, 14:50
— Да сегодня просто день интересных тем!! Получается 1 уровень это на день. Что-то много :)
Oleg Latysh Backend Developer в Askona
28 ноября 2020, 19:04
Может кому будет полезно. Если зажать alt + shift, то можно выставить много курсоров и менять значения в нескольких местах. Например в задачах на минимально и максимальное число, можно было из прошлой задачи поменять min на max.
Данияр Теленгутов
29 уровень, Алматы
28 марта, 09:33
Ого, спасибо огромное!!!😁