undefined

Как пользоваться абстрактными классами

Java Core
3 уровень , 3 лекция
Доступна

— Привет, Амиго! Вчера ты уже слушал лекцию про абстрактные классы. Теперь пришло время углубить наши познания. Хочу научить тебя правильно пользоваться абстрактными классами.

Сложно представить аналогию абстрактного класса в реальной жизни. Обычно класс является моделью какой-нибудь сущности. Но абстрактный класс содержит не только реализованные методы, но и не реализованные. Что же это значит? Аналогом чего является абстрактный класс и есть ли у него аналоги в реальном мире?

На самом деле есть. Представь себе почти законченный кузов машины на конвейере. Туда могут поставить как спортивный двигатель, так и экономичный. Как кожаный салон, так и матерчатый. Конкретная реализация машины еще не определена. Более того, таких конкретных реализаций на основе этого кузова предполагается несколько. Но в таком виде машина никому не нужна. Это — классический абстрактный класс: его объекты не имеют смысла, поэтому их создание запрещено, класс имеет смысл, но только для его многочисленных полноценных наследников, которые будут созданы на его основе.

— Это не сложно.

— Но могут быть и более абстрактные аналогии. Больше похожие на интерфейсы, с несколькими реализованными методами. Например, профессия переводчик. Без уточнения, с какого, и на какой язык, получим «абстрактного переводчика в вакууме». Или телохранитель. Про него может быть известно, что он владеет боевыми искусствами и может защитить клиента. Но какими именно единоборствами, и каким способом защитить клиента – это уже «особенности реализации» каждого конкретного телохранителя.

Давай посмотрим пример:

Код на Java Описание
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot(Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot(attacker);
  else
     applyMartialArts(attacker);
 }
}
В классе «телохранитель» определено, как поступать в случае нападения: стрелять или применить боевые искусства.

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

Мы можем создать несколько разных телохранителей (унаследовав этот класс). Все они будут уметь защищать клиента и стрелять в нападающего.

— Действительно, по смыслу очень напоминает интерфейс с несколькими реализованными методами.

— Да, абстрактные классы такого типа мы будем часто встречать среди стандартных классов JavaSE.

undefined
3
Задача
Java Core, 3 уровень, 3 лекция
Недоступна
Набираем код Ӏ Java Core: 3 уровень, 3 лекция
Java Core: 3 уровень, 3 лекция. Внимание! Объявляется набор кода на JavaRush. Для этого включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).
Комментарии (141)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Yeikovych Volodymyr Уровень 28 Киев Украина
26 мая 2021
Всё получится!
SerVer4675@gmail.com Уровень 32 Киев
19 мая 2021
Коллеги, тут такой вопрос нарисовался: зачем интерфейсы - понимаю; для чего абстрактные классы - тоже понимаю. А вот зачем и то и другое вместе взятое - не понимаю. Объясните возможно ли в "больших и толстых" проектах использование только интерфейсов и классов, без абстрактных классов. Так мыслю, исторически сложилось, что вначале были абстрактные классы, а потом придумали интерфейсы и от использования абстрактных классов можно отказаться. Или не правильно мыслю?
Nick Уровень 20
17 апреля 2021
Не знаю, мне больше всего нравиться пример абстрактного класса в виде - Шахматной фигуры. От которого наследуются классы: пешки, ферзи и лошадки - и они уже создают объекты. Просто и полезно.
Aleksey Grin Уровень 15 Санкт-Петербург Россия
7 апреля 2021
Откуда взялся gun c методом shoot ?
Georgii Уровень 24 Москва
7 февраля 2021
Для тех кому надоели прописи: 1. Жмем F12 - открывается хром дев тулз. 2. Жмем ctrl + shift + c. 3. Выбираем прямоугольник с тем, что надо переписать (выделится синим). 4. В списке раскрываем div-контейнеры и щелкаем по ним, пока не найдете тот, в котором в стилях внизу не появится строчка overflow: hidden. 5. Отжимаем галочку на этой строчке - она станет зачеркнутой. 6. Теперь можно просто скопировать текст в решение. 7. ??? 8. Profit!
🦔 Виктор Уровень 20 Москва Россия Expert
1 января 2021
Впервые скопи-пейстил код для набора, не выдержал таких издёвок над стилем кода: Стайлгайд для Java (Java-конвенция кода). Всё получится!
Сергей Уровень 17 Москва Россия
8 декабря 2020
Сказочный переводчик
Дмитрий Уровень 19 Новосибирск Россия
16 ноября 2020
Потихоньку начал понимать больше мелочей. 1) Я всегда думал, что может быть только один публичный класс в одном Jave файле. Сейчас узнал, что если в публичном классе создать еще публичные классы, то можно создавать их сколько угодно. За его пределом уже нельзя. 2)Абстрактный класс. Все абстрактные методы мы должные реализовать в классе наследника. Если не абстрактный метод, то можно не реализовать его в классе наследника, но мы можем переопределить его, так же как в интерфейсах. (Так можно с появлением в интерфейсах default). 3) Понял чем, отличается абстрактные классы от интерфейсов. 1. Интерфейсы имеют множество наследование только от интерфейсов, так как класс имеет, только одно наследование, так же как и абстрактный класс от любого другого класса. 2. Если мы создаем абстрактный класс и создаем абстрактный метод, мы заключаем контракт, с наследником он должен вернут свой метод реализации. Как из лекции с машиной.

public static abstract class Car {
        public abstract String getSittingMaterial();  // Материал сидений
        public abstract String getMotor();  // Мотор  }    
Смотрим на наши контракты, которые мы заключили, что мы обязаны сделать в нашей машине?

public static class ToyotaCar extends Car {
    public String getSittingMaterial() {    //наш контракт
    return "Мои сидения кожаные"; }
  public String getMotor() {             //наш контракт
    return "Мои мотор 1jz gte"; }
}
Как мы укомплектовали наши машину по контракту Абстрактных классов. После того наши машина уже собрана мы можем вызывать интерфейсы к нашей машины, что она должна делать тормозить, ехать и т. д.

interface Gas {
default void getGas() {
      System.out.println("Машина едет"); }
        }
interface Stop{
default void getStop() {
      System.out.println("Машина тормозит"); }
        }
Алексей Уровень 15 Саранск Россия
16 октября 2020
Правильно я думаю, что где-то в коде есть класс Gun с реализованным методом shoot ?
Асет Уровень 24 Москва
27 сентября 2020
Пфф.. скучно живете