полиморфные переменные

разбирали такой код в университете:

Класс Car:

public class Car {
    public void drive() {
        System.out.println("Машина едет");
    }
}

Класс Bmw:

public class Bmw extends Car {
    @Override
    public void drive() {
        System.out.println("Бмв едет");
    }
}

Класс Mercedes:

public class Mercedes extends Car {
    @Override
    public void drive() {
        System.out.println("Мерседес едет");
    }
}

Класс Audi:

public class Audi extends Car {
    @Override
    public void drive() {
        System.out.println("Ауди едет");
    }
}

Класс Main:

public class Main {
    public static void main(String[] args) {
        Car bmw = new Bmw();
        bmw.drive();
        Car mercedes = new Mercedes();
        mercedes.drive();
        Car audi = new Audi();
        audi.drive();
    }
}

Это я понимаю: Набор методов, которые можно вызвать у переменной, определяется типом переменной. А какой именно метод какая реализация вызовется, определяется типом/классом объекта, ссылку на который хранит переменная.

А кроме этого есть ли преимущества делать тип ссылочной переменной класс родитель? И вообще почему больше всего примеров где тип ссылочной переменной родитель?


Ответы (1 шт):

Автор решения: Вадим

Очень часто используется при реализации полиморфизма. Чаще всего Car это вообще абстрактный класс или интерфейс. И тогда при передачи объекта в методы другого объекта, например в метод toWash класса СarWash используется ссылка по типу Car так как автомойке не обязательно (даже скорее не нужно) знать какой марки автомобиль необходимо помыть, действия все равно будут происходить одинаковые (намочить, запенить, смыть и тд.). Тем самым происходит избавление от дублирования кода (иначе вы бы создавали множество методов toWash с разными по типу принимаемыми параметрами Audi, BMW и тд, но с одинаковым телом).

→ Ссылка