Абстрактные классы и методы в 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
IDEA тоже подозревала это заранее.
Но нам никто не запретит обработать наши объекты вот так:
class Test{
public static void main(String[] args) {
Pet pet = new Duck();
Duck duck = new Duck();
}
}
Это вполне себе валидный код.
Абстрактный класс #
- Класс, который содержит в себе ключевое слово abstract. класс должен быть абстрактным, если он содержит хотя бы один абстрактный метод.
- Абстрактные классы в Java могут содержать или не содержать абстрактные методы, т.е. методы без тела protected void move();
- Абстрактные классы не могут быть инстанцированы(объекты класса не могут быть созданы).
- Класс наследник абстрактного класса обязан имплементировать все абстрактные методы базового класса.
Абстрактный метод #
- Ключевое слово abstract используется для объявления метода абстрактным.
- У абстрактного метода нет тела и соответственно фигурных скобок.
- Абстрактный метод имеет только сигнатуру (название метода плюс параметры).
Пример реализации #
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.
Дополнительные ссылки #
Ссылок не будет, потому что абстрактные классы обычно(всегда) объясняются с интерфейсами. Определённо между ними есть связь, но всё же интерфейсы будут позже. Давайте закрепим материал.
Домашнее задание #
- Измените своих домашних животных из урока с наследованием. Реализуйте абстрактны класс Pet.
- Добавьте в вашу экосистему дракона “Змей Горыныч”, чёрного цвета.