018 Java Oop Abstraction

Абстрактные классы и методы в Java #

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

Одна из парадигм ООП - схожее объединять. И эта парадигма может объединить и разные методы. Пример разных методов есть у домашних животных. Лошадка скачет, собачка бежит, птичка летит, рыбка плывёт. Метод движения нам нужен, потому что мы должны прописать передачу целевых координат и задать движение объекта.

В данном случае нам поможет абстрактный класс.

abstract class Pet {
    abstract void moves();
}

Абстрактным класс называется, если в нём есть хотя бы один метод абстрактный. Без тела. Этот метод должен быть реализован в каждом классе наследнике, так как больше подходит этому типу.

class Duck extends Pet{
    void moves() {
    }
}

Мы можем создавать не только абстрактные методы, но и “обычные”:

abstract class Pet {
    abstract void moves();

    protected void eats() {
        System.out.println("Трёхразовое питание");
    }
}

Обычные методы наследуются так же, как мы учили в “наследовании”, а это значит, что они должны быть переопределены.

class Duck extends Pet {
    void moves() {
    }

    @Override
    protected void eats() {
        super.eats();
    }
}

Ещё раз:

Абстрактные методы имплементируются(implemented), родительские классы переопределяются(override)

Пример создания объекта абстрактного класса. #

class Test{
    public static void main(String[] args) {
        Pet pet = new Pet();
    }
}

Попытка запуска/компиляции такого кода приведёт к следующей ошибке:

java: Pet is abstract; cannot be instantiated
создание объекта абстрактного класса

abstract instance

IDEA тоже подозревала это заранее.

Но нам никто не запретит обработать наши объекты вот так:

class Test{
    public static void main(String[] args) {
        Pet pet = new Duck();
        Duck duck = new Duck();
    }
}

Это вполне себе валидный код.

Абстрактный класс #

  1. Класс, который содержит в себе ключевое слово abstract. класс должен быть абстрактным, если он содержит хотя бы один абстрактный метод.
  2. Абстрактные классы в Java могут содержать или не содержать абстрактные методы, т.е. методы без тела protected void move();
  3. Абстрактные классы не могут быть инстанцированы(объекты класса не могут быть созданы).
  4. Класс наследник абстрактного класса обязан имплементировать все абстрактные методы базового класса.

Абстрактный метод #

  1. Ключевое слово abstract используется для объявления метода абстрактным.
  2. У абстрактного метода нет тела и соответственно фигурных скобок.
  3. Абстрактный метод имеет только сигнатуру (название метода плюс параметры).

Пример реализации #

abstract class Pet {
    String name;

    public Pet() {
    }

    public Pet(String name) {
        this.name = name;
    }

    abstract void moves();

    protected void eats() {
        System.out.println("Трёхразовое питание");
    }
}

class Duck extends Pet {

    public Duck(String name) {
        super(name);
    }

    void moves() {
        this.flies();
    }

    void flies() {
        System.out.println("Лети птичка");
    }

    @Override
    protected void eats() {
        super.eats();
    }
}

class Test {
    public static void main(String[] args) {
        Pet pet = new Duck("Дональд Дак");
        Duck duck = new Duck("Дейзи Дак");
    }
}

Вот так может работать реализации абстракции в Java.

Дополнительные ссылки #

Ссылок не будет, потому что абстрактные классы обычно(всегда) объясняются с интерфейсами. Определённо между ними есть связь, но всё же интерфейсы будут позже. Давайте закрепим материал.

Домашнее задание #

  1. Измените своих домашних животных из урока с наследованием. Реализуйте абстрактны класс Pet.
  2. Добавьте в вашу экосистему дракона “Змей Горыныч”, чёрного цвета.
comments powered by Disqus