Java: поздняя привязка и где я ее использую? В чем выгода?

Я пытаюсь понять позднюю привязку. И результаты поиска: Late Binding: тип неизвестен, пока переменная не будет использована во время выполнения; обычно с помощью присваивания, но есть и другие способы принуждения типа; Динамически типизированные языки называют это основной функцией, но многие статически типизированные языки имеют некоторый метод достижения позднего связывания.

и пример такой:

 public class DynamicBindingTest {

    public static void main(String args[]) {
        Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car
        vehicle.start();       //Car's start called because start() is overridden method
    }
}

class Vehicle {

    public void start() {
        System.out.println("Inside start method of Vehicle");
    }
}

class Car extends Vehicle {

    @Override
    public void start() {
        System.out.println("Inside start method of Car");
    }
}

Но какая польза от ТС = новая машина (); используя это. Нужно просто написать Car car = new Car();? Пожалуйста, объясните мне?

2 ответа

Решение

Но какая польза от ТС = новая машина (); используя это. Нужно просто написать Car car = new Car();? Пожалуйста, объясните мне?

Да, вы могли бы сделать это. В этом крошечном примере нет немедленной выгоды в позднем связывании.

Но как насчет этого немного другого примера?

public static void main(String args[]) {
    Vehicle vehicle = (args[0].equals("car")) ? new Car() : new Vehicle();
    vehicle.start(); 
}

... или если мы добавим больше подклассов Vehicleи (скажем) создать экземпляр Car или Truck...


Есть и другие преимущества, которые станут вам понятнее, когда вы приобретете опыт в программировании, особенно если вам придется писать и поддерживать более крупные программы.


Для записи, Java обычно классифицируется как статически типизированный язык. И полиморфизм / поздняя привязка как в вашем, так и в моем примере зависит от статической типизации. Динамическая типизация вступает в игру, только если мы используем приведение типов, instanceof и тому подобное.

Различие между статической и динамической типизацией заключается в том, когда происходит проверка типа. Если проверка типов происходит (в основном) во время компиляции и ошибки сообщаются во время компиляции, то язык проверяется статически.


Мы могли бы также добавить больше подклассов Vehicleи измените main метод для создания и запуска любого типа транспортного средства, не упоминая имена подклассов в исходном коде для main, Это еще один аспект позднего связывания, который не очевиден в вашем примере.

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

И ответ на второй вопрос: почему?

 vehicle car= new Car();

и не

   Car car= new Car();

Это полиморфизм, и речь идет о ситуации, когда вы должны использовать цикл for с автомобилем и велосипедом. Они оба являются транспортными средствами, поэтому здесь мы создадим массив транспортных средств и можем хранить как объекты, так и нам не нужно использовать велосипед и автомобиль. петли по-разному.

Другие вопросы по тегам