【问题标题】:Java: late binding and where i use it? What's benefit?Java:后期绑定以及我在哪里使用它?有什么好处?
【发布时间】:2017-09-03 03:25:41
【问题描述】:

我正在尝试理解后期绑定。并搜索结果: 后期绑定:在运行时执行变量之前,类型是未知的;通常通过赋值,但还有其他方法来强制类型;动态类型语言将此称为底层特性,但许多静态类型语言都有一些实现后期绑定的方法。

例子是这样的:

 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 = new Car();使用这个。应该只写 汽车 car = new Car(); ?请给我解释一下?

【问题讨论】:

标签: java late-binding


【解决方案1】:

但有什么好处 Vehicle = new Car();使用这个。应该只写 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 方法以创建和启动任何 种车辆,而在@ 的源代码中不提及子类的名称987654328@。这是您的示例中不明显的后期绑定的另一个方面。

【讨论】:

    【解决方案2】:

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

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

     vehicle car= new Car();
    

    而不是

       Car car= new Car();
    

    这是多态性,考虑了一种情况,当您必须对汽车和自行车使用 for 循环时。它们都是车辆,所以在这里我们将创建一个车辆数组并可以存储这两个对象,我们不必使用自行车和汽车的循环方式不同。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2014-06-01
      • 1970-01-01
      • 2011-07-04
      • 2015-05-30
      • 2021-06-25
      • 2015-04-12
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多