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
的子类,并且(比如)实例化 Car
或 Truck
...
还有其他好处,随着您获得编程经验,您会变得更加清楚,尤其是当您必须编写 和维护 更大的程序时。
郑重声明,Java 通常被归类为静态类型语言。你的例子和我的例子中的多态性/后期绑定都依赖于静态类型。动态类型只有在我们使用类型转换时才会发挥作用,instanceof
和类似的。
静态类型和动态类型之间的区别在于何时进行类型检查。如果类型检查(大部分)发生在编译时,并且在编译时报告错误,那么语言将被静态检查。
我们还可以添加更多 Vehicle
的子类,并修改 main
方法来创建和启动 任何 种车辆,而无需提及名称main
的源代码中的子类。这是后期绑定的另一个方面,在您的示例中并不明显。
要调用的方法是在运行时决定的,在此处的每种情况下,都基于对象的运行时类型。在编译时做出的唯一决定是调用最终方法、私有方法或静态方法,或者在一组重载方法中进行选择(如果重载方法不是最终方法、私有方法或静态方法,这仍可能导致运行时选择。)
以及第二个问题的答案:
为什么?
vehicle car= new Car();
而不是
Car car= new Car();
这是多态性,考虑到必须对汽车使用 for 循环并且 bike.They 都是车辆的情况,所以在这里我们将创建一个车辆数组并可以存储这两个对象,但我们不不必以不同方式使用自行车和汽车环路。
我正在尝试了解后期绑定。和搜索结果: 后期绑定:类型未知,直到变量在 运行 时间内被执行;通常通过赋值,但还有其他方法来强制类型;动态类型语言将此称为基础功能,但许多静态类型语言都有一些实现后期绑定的方法。
示例如下:
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
的子类,并且(比如)实例化 Car
或 Truck
...
还有其他好处,随着您获得编程经验,您会变得更加清楚,尤其是当您必须编写 和维护 更大的程序时。
郑重声明,Java 通常被归类为静态类型语言。你的例子和我的例子中的多态性/后期绑定都依赖于静态类型。动态类型只有在我们使用类型转换时才会发挥作用,instanceof
和类似的。
静态类型和动态类型之间的区别在于何时进行类型检查。如果类型检查(大部分)发生在编译时,并且在编译时报告错误,那么语言将被静态检查。
我们还可以添加更多 Vehicle
的子类,并修改 main
方法来创建和启动 任何 种车辆,而无需提及名称main
的源代码中的子类。这是后期绑定的另一个方面,在您的示例中并不明显。
要调用的方法是在运行时决定的,在此处的每种情况下,都基于对象的运行时类型。在编译时做出的唯一决定是调用最终方法、私有方法或静态方法,或者在一组重载方法中进行选择(如果重载方法不是最终方法、私有方法或静态方法,这仍可能导致运行时选择。)
以及第二个问题的答案: 为什么?
vehicle car= new Car();
而不是
Car car= new Car();
这是多态性,考虑到必须对汽车使用 for 循环并且 bike.They 都是车辆的情况,所以在这里我们将创建一个车辆数组并可以存储这两个对象,但我们不不必以不同方式使用自行车和汽车环路。