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

Открыта

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

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

— Спасибо!

— Да не за что.

— Помнишь ситуацию, когда мы ввели базовый класс 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(); //абстрактный метод. Реализация отсутствует.

}
14
Задача
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-методами.

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

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

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

Комментарии (90)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
sergey12 уровень, Львов
среда, 11:21
А можно абстрактный класс унаследовать от другого абстрактного класса?
public abstract  class ChessItem2 extends ChessItem{}
Roman Maltsev17 уровень, Ростов-на-Дону
позавчера, 18:42
Почему бы и нет, это ничему не противоречит , этот вариант подходит под пункт лекции 4 "4) Если ты наследовал свой класс от абстрактного класса, то нужно переопределить все унаследованные абстрактные методы — написать для них реализацию. Иначе такой класс тоже придется объявить абстрактным"
S22 уровень, Минск
26 июля, 15:49
Вопрос - зачем вообще нужны абстрактные классы, если есть интерфейсы? Интерфейсы поддерживают множественное наследование, также могут содержать неабстрактные методы.
Roman Maltsev17 уровень, Ростов-на-Дону
позавчера, 18:49
По функционалу они близки ( хотя и есть различия), Но по прежнему несут разную смысловую нагрузку в абстракции. Абстрактным классом удобно описать модель, а интерфейсом ее поведение. ну и ссылочка
S22 уровень, Минск
26 июля, 15:16
Если в классе есть хотя-бы один нереализованный метод,
объявленный прямо в нем или унаследованный от класса-родителя,
 то класс считается абстрактным.
Не знаю - создал себе обычный метод без реализации в обычном классе и компилятор даже не пикнул. По-моему в этом предложении написана лажа.
Александр Малых19 уровень, Коряжма
31 июля, 20:34
убери {} и метод будет нереализованным и компилятор потребует объявления класса абстрактным
Olga Enaldieva19 уровень
19 июня, 09:27
Ого, 14 материи за набор текста!
Vgoose18 уровень, Москва
13 июня, 21:03
Хорошая попытка, но нет. Не перейду на тёмную сторону объявлений нескольких полей в одну строку и переноса { скобки. :P
Alex16 уровень, Одесса
28 мая, 15:26
Надо будет вернуться через пару месяцев к этому комменту и посмотреть чего я достиг за это время! А пока всем удачи и "Да прибудет с Вами Сила!"
Павел25 уровень, Минск
21 июня, 07:42
по-видимому, не очень многого)
Alex16 уровень, Одесса
21 июня, 18:00
Ага, надо перестать читать книги )))
Mikhail16 уровень, Москва
24 июля, 09:03
похоже, книги читать не перестал)
Alex16 уровень, Одесса
30 июля, 07:56
Ага, это точно)))) Отпуск никак не способствует обучению что-то)
Lil Freezer15 уровень, Пермь
18 августа, 12:57
бро пора уже))
Антон13 уровень, Москва
4 апреля, 04:11
Если я правильно понимаю, то когда мы создаем абстрактный класс и делаем для него абстрактный метод, то при создании дочернего класса мы обязаны будем переопределить для него метод чтобы все корректно заработало. В контексте лекции, необходимо будет переопределить метод draw(), иначе наша фигура просто не будет отрисована.
Valery20 уровень
8 мая, 15:52
да, нужно будет написать логику draw() для каждой фигуры. Если не написать в классе потомка, то он тоже станет абстрактным
Alexander Krymov14 уровень, Нижний Новгород
4 марта, 09:38
Обожаю подачу в этом курсе! вот 3 вещи: 1) ... 2) ... 3) ... 4) ... Запомните эти 4 принципа: 1. ... 2. ... 3. ... 4. ... 5. ...
VN27 уровень
28 апреля, 17:36
Реши эти пару сотен задач: 1) 2) 3) 4) 5)
Самуил Олегович26 уровень, Киев
19 мая, 10:14
Пробрасывайте дальше такие исключения)))
Даниил34 уровень
16 декабря 2018, 10:37
Вот понять не могу одного. Куча комментариев под лекциями от людей которые оставили их не одну неделю, а то и месяц назад и с тех пор прошли всего несколько уровней. И все они останавливаются в диапазоне 17-24 уровней. Почему так?! Люди, куда вы деваетесь? Может со временем понимаешь что тут ловить нечего? Я в это могу поверить, но только в случае если человек готовый программист, которому просто нужно было познакомиться с синтаксисом. Кто мне объяснит почему так случается?
Сергей15 уровень
20 декабря 2018, 13:42
Может на работу выходят?? И там начинается такой ДжаваРааааш... Только не за "черную материю", а за реальные деньги) Ну или увольнение)
Даниил34 уровень
20 декабря 2018, 18:24
Ну вот в том то и вопрос: если человек с нулевыми знаниями (в программировании вообще, как я) дошёл до примерно 20 уровня тут, врядли его куда-то возьмут. Ну небось люди или были с базой, ознакомились с нюансами для языка и пошли рубить бабло, либо я чего-то не знаю)))
Сергей15 уровень
21 декабря 2018, 11:10
Не понял логику, почему его не возьмут? Но забегая вперёд, сразу отвечу. Чтобы комфортно и легко дойти до высокого уровня тут, надо быть не только тут (соррян за каламбур). Я, например, прохожу ещё обучение на другом портале, подписываюсь на всякие тесты и движи, смотрю какие-то бесплатные видосы, читаю статьи, книги. Изучая информацию из разных мест в голове складывается более полная картинка и появляется понимание и чувство уверенности, что ты что-то соображаешь и можешь сделать.
Даниил34 уровень
21 декабря 2018, 13:03
Та я тоже больше информации черпаю не с этого ресурса, но логика в состояла том что Я ПРЕДПОЛАГАЮ что если начать обучение с уровнем "не умею на любом языке вывести "Hello World" и выучить более-менее всё что дают до 20 уровня тут (изучая углублённо, не только в маленьких ознакомительных лекциях тут) то врядли можно претендовать на Джуна
Вадим35 уровень, Новосибирск
4 января, 18:54
Думаю на стажировку после 20 уровня можно пойти.
Даниил34 уровень
4 января, 20:25
Стажировку в смысле в какую-то компанию?
Denis Fedotov22 уровень, Москва
5 января, 20:35
а сам то куда пропал?))
Даниил34 уровень
6 января, 11:32
Та куда... Праздники, пьянки, и как-то в кучу себя взять не получается основательно. Да и конец года, начало нового - на работе завал. Но это всё отмазки, сейчас с мыслями собираюст и пробую дальше пахать) Но я ж не бросаю как те о которых я говорил, т. е. совсем?
Юрий33 уровень, Минск
7 января, 20:07
так она видна, только в IDEA, на начальных уровнях было больше 60_000 решений задачи, а сейчас только 20_000 в среднем.
Parsifal24 уровень, Алматы
9 января, 18:57
помоему им не интересно комментит, только отзывчивые отвечают
Denis Filokhin22 уровень
24 января, 16:44
У меня друг прошел до 25. Сказал, что бросил, т.к. по его мнению ничего нового не дают, просто дают более сложные задачи на основе пройденного материала. Так это или нет, постараюсь проверить на личном опыте. Ну и работу нашел )
Даниил34 уровень
24 января, 17:27
Если нашёл работу, то реально смысла тут сидеть уже крайне мало, если на работе делом занимаешься. На счёт того "ничего нового", то скажу так: дошёл до 19 уровня пока (начав с нулевымм знаниями в программировании вообще) и каждое новое задание так или иначе полезно или ОЧЕНЬ полезно.
Виталий Погодаев30 уровень, Владивосток
7 февраля, 13:08
Мне кажется, что имея 17-20 уровней тут, на работу устроиться полноценным разрабом нереально. Разве что на internship либо на курсы в EPAM и т.п. Скорее всего просто забивают, тем более если подписка была на месяц.
Даниил34 уровень
7 февраля, 14:49
Заканчивая 20 уровень я кажется нашёл ответ на свой первый вопрос... Реально дальше идут только те кто не намерен разворачиватся, потому что реально тяжело моментами. И времени всё больше и больше уходит...
Андрей18 уровень, Новосибирск
16 февраля, 15:30
Дальше на мультитрединг пошёл или в коллекции?
Даниил34 уровень
17 февраля, 08:45
Пошёл по потокам, но советовали к середине квеста пару первых уровней пройти по коллекциям.
Dmitry19 уровень, Екатеринбург
18 марта, 19:50
Я читаю твой коммент и у тебя 24 уровень. Будь осторожен)
Даниил34 уровень
18 марта, 20:43
Я осторожен) А пока я на месяцок прекратил занятия тут потому что отпуск бывает раз в году...
Justinian36 уровень, Киев
3 апреля, 11:21
На любых курсах количество людей сокращается с повышением уровня сложности. Проходит запал, семья, дети, работа, изменились планы, деньги, просто забрасывают, лень/зона комфорта отторгает, отпуск :) Причин и преград миллион, до конца доходят только самые мотивированные и дисциплинированные люди, которые знают чего хотят на 100% и готовы приложить необходимые усилия.
Даниил34 уровень
3 апреля, 17:02
Полностью с тобой согласен, как раз сегодня крайний день отпуска так что с завтра продолжаем) А ты догоняй) Думаю я достаточно медленно продвигаюсь что бы это было реально сделать многим)
Justinian36 уровень, Киев
3 апреля, 18:46
Ок :) У всех свой темп, здесь как в марафоне, главная задача дойти/добежать/доползти до финиша, для этого важно найти свой ритм постоянный и с ним идти, те кто сначала давят на газ, часто потом истощаются и запускают. Да и медленно/быстро, все относительно, а с другими сравнивать смысла мало, у всех разное количество свободного времени и разный опыт в программировании, включая java. Так что терпения нам всем и целеустремления :)
Даниил34 уровень
4 апреля, 11:07
Золотые слова)
Aeon15 уровень, Санкт-Петербург
5 апреля, 16:36
Помимо того, что уже назвали, стоит также учитывать, что не у всех на JavaRush одинаковые цели, и не каждый планирует стать именно программистом. Расскажу про себя. Я уже работаю в IT компании и занимаюсь ручным тестированием. Хочу заниматься автоматизацией, поэтому и взялся за программирование. Мои задачи будут достаточно сильно отличаться от задач коллег-программистов. Мне явно первое время не нужно забивать голову мультипоточностью, сложными алгоритмами, хайбернейтом и спрингом. Я уже вижу, что дошёл до того минимума, который позволяет писать мне тесты, поэтому JavaRush уже не понадобится – все остальное буду изучать уже непосредственно на работе, плюс нужно выделить время на освоение инструментов именно для автотестов, чего здесь нет. Тестировщик я здесь не один, поэтому так прекратят заниматься и некоторые другие. А кому-то, возможно, не понравилась подача на портале, и они ушли на курсы в Stepik, Udemy и т.д.
Даниил34 уровень
5 апреля, 21:03
Вполне возможно всё так как вы описываете, но уже ооочень много народу не доходит до 30 уровней, хотя реально как я понял к 30-му уровню знаний у меня будет совсем мало, молчу у же про умения. Это всё видно из темпов падения количества решивших те или иные задания. И опять же, я склонен считать что большая часть всё таки здесь ради той самой цели которую на сайте дают - стать джуном суметь получить работу. А на счёт Udemy - лично я не знаю как получить умения там которые приобретаешь тут выполняя задания. А Stepik (опять же субъективно) какой-то то ли сложный для меня, то ли непонятный. Короче вообще не зашёл...
Alexander15 уровень
20 апреля, 08:18
Не понимаю, зачем смотреть на других? У каждого своя дорога, тут иногда просто для общения сидят или помочь хотят, кто от нечего делать, изучив что-то просто забивают, основная работа, семья, лень и т.д.
Павел Славен19 уровень, Москва
25 апреля, 19:29
Как там, на 26?) Жарко?
Даниил34 уровень
25 апреля, 19:43
Моментами жарко. Но конечно уже мало таких задач которые по щелчку решаються. Даже если задача маленькая (типо пару строк исправить), то для себя сидишь и вникаешь в нужный материал пол часа, час или больше. Главное не сдаваться в моменты разочарований "какой же я тугой"...
y-grek15 уровень, Киев
6 мая, 19:57
спасибо пацаны (и девченки).. реально очень упал темп прохождения.. и ведь не изза сложности.. пока все понятно.. но на самом деле, наличие свободного времени/ праздники / отпуски / поездки.. лень.. распорошило меня.. а ваши успехи и меня вперед двигают.. такие треды нужны..
Sergey Shavlyuga16 уровень, Санкт-Петербург
18 мая, 19:58
Прямо целая развёрнутая история на вопрос, который меня мучал с уровня эдак 8-го) Спасибо, что ты ещё здесь!)
Alex16 уровень, Одесса
28 мая, 15:23
Интересненько) Смотрю уже 29 уровень, не сдаешься! Красавчик! Буду и я на цели, посмотрим что будет через пару месяцев со мной!
Даниил34 уровень
28 мая, 16:38
Мой темп желает "желать лучшего", но я просто иду до конца курса стараясь вникать, а не тупо сдавая задачи на проверку.
Alex16 уровень, Одесса
28 мая, 19:18
Я думаю, что так и надо учиться... Еще бы больших перерывов не делать)
Руслан15 уровень
18 июля, 11:43
Хорошо идешь! 32 уровень.
Даниил34 уровень
18 июля, 13:19
Медленно, но уверенно (по крайней мере по уровням сайта). На самом деле пройдя всю многопоточность (а в ней многопоточности меньше чем в курсе Java Core) и начав коллекции понимаешь что ещё очень мало что знаешь... Так что пройдя весь курс ты явно не будешь готов уверенно пройти собеседование так как ещё очень много чего нужно выучить помимо того что даёт курс. Даже не буду пугать названиями)))
foralis16 уровень
21 июля, 13:12
Удачи! Встретимся на 40ом уровне)
Mikhail16 уровень, Москва
24 июля, 09:38
а ты попробуй. некоторые работу находят и на 20м уровне. если в Москве - то точно пробуй. я для себя понял, что стремиться выучить всё до собеседования - утопия. надо начинать искать работу как можно раньше. поймёшь чего тебе не хватает. хотя, если ты сразу на позицию мидла метишь.. то курс верный))
Даниил34 уровень
24 июля, 13:31
Не, на мидла я не тяну, но как бы мозг подсказывает что и для Джуна я знаю мало на своем то нынешнем 33-м уровне. Может именно по Джаве моих знаний и достаточно что бы пройти собеседование, но нужно ещё как минимум знать азы всяких страшных слов, таких как Spring, Hibernate, Maven и т.д. А я в этом 0. Я бы уже наверное попробовал себя на собеседовании что бы реально понимать как мне далеко и куда двигаться, но пока такой возможности объективно нет (свои жизненные приколы). Но другим я бы советовал уровня так с 20-25 попробовать сходить на собеседование. Загвоздка в том кто тебя на него позовёт если в резюме ни опыта, ни чего кроме знаний Джава толком, а указывать то что ты не знаешь - смелый поступок)))
Александр Сам15 уровень
5 августа, 11:29
А ты молодец! 34 уровень уже. Надеюсь, и я там буду )
Макс26 уровень, Киев
4 ноября 2018, 18:04
АСТРАКТНЫЙ КЛАСС ✔ Может содержать объявление метода без его реализации (абстрактный метод) ✔ Если в классе есть хоть один абстрактный метод, класс тоже помечается ключевым словом abstract ✔ Создавать объекты абстрактного класса нельзя. Но можно создавать переменную типа абстрактного класса и присвоить ей ссылку на объект не абстрактного дочернего класса. Пример ↓
// класс Animal абстрактный, класс Lion не абстрактный и унаследован от Animal
Animal lionFather = new Lion("Папуля");
✔ Класс-наследник абстрактного класса должен переопределять (реализовать) все абстрактные методы. Иначе класс-наследник придётся тоже пометить как абстрактный :(
Andrii Gorshunov41 уровень
15 ноября 2018, 20:53
Абстрактный класс может иметь абстрактные методы (без тела {} или без реализации, иными словами) и может иметь обычные методы (не абстрактные) с готовой реализацией.