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);
 }
}
В классе «телохранитель» определено, как поступать в случае нападения: стрелять или применить боевые искусства.

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

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

undefined
3
Задача
Java Core,  3 уровень,  3 лекция
Недоступна
Набираем код Ӏ Java Core: 3 уровень, 3 лекция
Java Core: 3 уровень, 3 лекция. Внимание! Объявляется набор кода на JavaRush. Для этого включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).

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

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

Комментарии (129)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
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
Пфф.. скучно живете
Phil Babinovich 22 уровень, Минск
21 сентября 2020
Так в итоге: абстрактные классы = интерфэйсы? конда нужно использовать каждый из них?
Prod Kowmar 17 уровень, Дмитров
16 сентября 2020
Традиции - дело святое!