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 с автомобилем и велосипедом. Они оба являются транспортными средствами, поэтому здесь мы создадим массив транспортных средств и можем хранить как объекты, так и нам не нужно использовать велосипед и автомобиль. петли по-разному.