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

时间:2017-09-03 03:25:42

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

但是有什么好处的车辆=新车();用这个。应该写 汽车=新车(); ?请向我解释一下?

2 个答案:

答案 0 :(得分:3)

  

但是有什么好处的车辆=新车();用这个。应该只写Car car = new Car(); ?请向我解释一下?

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

但是这个略有不同的例子呢?

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的源代码。这是后期绑定的另一个方面,在你的例子中并不明显。

答案 1 :(得分:0)

要调用的方法在运行时决定,在每种情况下都基于对象的运行时类型。在编译时做出的唯一决定是调用final方法,私有方法或静态方法,或者在一组重载方法中进行选择(如果重载方法不是final,private或static,它仍然可以导致运行时选择。)< / p>

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

 vehicle car= new Car();

而不是

   Car car= new Car();

这是多态性,并考虑到你必须使用汽车和自行车的for循环的情况。他们都是车辆所以在这里我们将制作一个车辆阵列,可以存储两个对象,我们没有不同地使用自行车和汽车循环。