我试图理解后期绑定。搜索结果: 后期绑定:在运行期间执行变量之前,类型是未知的;通常通过分配,但还有其他方式强制一种类型;动态类型语言称之为底层特征,但许多静态类型语言都有一些实现后期绑定的方法。
和示例是这样的:
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");
}
}
但是有什么好处的车辆=新车();用这个。应该写 汽车=新车(); ?请向我解释一下?
答案 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
的子类,并(比方说)实例化Car
或Truck
......
还有其他好处,随着您获得编程经验,您将变得更加清晰,尤其是当您必须编写并维护更大的程序时。
对于记录,Java通常被归类为静态类型语言。并且你的例子和我的多态/后期绑定都依赖于静态类型。如果我们使用类型转换,instanceof
和类似的转换,动态类型才会起作用。
静态和动态类型之间的区别是在类型检查发生时。如果在编译时(大部分)发生类型检查并且在编译时报告错误,那么将静态检查语言。
我们还可以添加更多Vehicle
的子类,并修改main
方法来创建和启动任何类型的工具,而不提及其中的子类名称。 main
的源代码。这是后期绑定的另一个方面,在你的例子中并不明显。
答案 1 :(得分:0)
要调用的方法在运行时决定,在每种情况下都基于对象的运行时类型。在编译时做出的唯一决定是调用final方法,私有方法或静态方法,或者在一组重载方法中进行选择(如果重载方法不是final,private或static,它仍然可以导致运行时选择。)< / p>
第二个问题的答案: 为什么?
vehicle car= new Car();
而不是
Car car= new Car();
这是多态性,并考虑到你必须使用汽车和自行车的for循环的情况。他们都是车辆所以在这里我们将制作一个车辆阵列,可以存储两个对象,我们没有不同地使用自行车和汽车循环。