Java:后期绑定以及我在哪里使用它?有什么好处?

Java: late binding and where i use it? What's benefit?

我正在尝试了解后期绑定。和搜索结果: 后期绑定:类型未知,直到变量在 运行 时间内被执行;通常通过赋值,但还有其他方法来强制类型;动态类型语言将此称为基础功能,但许多静态类型语言都有一些实现后期绑定的方法。

示例如下:

 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");
    }
}

但是有什么好处 Vehicle vehicle = new Car();使用这个。应该只写 汽车汽车=新汽车(); ?请给我解释一下?

But what's benefit Vehicle vehicle = new Car(); using this. Should just write Car car = new Car(); ? Please explain to me?

是的,你可以做到。在这个小例子中,后期绑定几乎没有立竿见影的好处。

但是这个稍微不同的例子呢?

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

... 或者如果我们添加更多 Vehicle 的子类,并且(比如)实例化 CarTruck ...


还有其他好处,随着您获得编程经验,您会变得更加清楚,尤其是当您必须编写 和维护 更大的程序时。


郑重声明,Java 通常被归类为静态类型语言。你的例子和我的例子中的多态性/后期绑定都依赖于静态类型。动态类型只有在我们使用类型转换时才会发挥作用,instanceof 和类似的。

静态类型和动态类型之间的区别在于何时进行类型检查。如果类型检查(大部分)发生在编译时,并且在编译时报告错误,那么语言将被静态检查。


我们还可以添加更多 Vehicle 的子类,并修改 main 方法来创建和启动 任何 种车辆,而无需提及名称main 的源代码中的子类。这是后期绑定的另一个方面,在您的示例中并不明显。

要调用的方法是在运行时决定的,在此处的每种情况下,都基于对象的运行时类型。在编译时做出的唯一决定是调用最终方法、私有方法或静态方法,或者在一组重载方法中进行选择(如果重载方法不是最终方法、私有方法或静态方法,这仍可能导致运行时选择。)

以及第二个问题的答案: 为什么?

 vehicle car= new Car();

而不是

   Car car= new Car();

这是多态性,考虑到必须对汽车使用 for 循环并且 bike.They 都是车辆的情况,所以在这里我们将创建一个车辆数组并可以存储这两个对象,但我们不不必以不同方式使用自行车和汽车环路。