我有以下代码:静态VS动态绑定逻辑
import java.lang.*;
public class Program
{
public static void main(String [] args)
{
B a = new A();
a.p(10);
a.p(10.0);
}
}
class B {
public void p(double i)
{
System.out.println(i*2);
}
}
class A extends B{
public void p(int i)
{
System.out.println(i);
}
}
当我执行使用B a = new A()
这个代码,我得到了这两种情况下这是有意义的,因为重载是在编译时编译器在哪里看手柄20.0声明的类型并适当调用一个函数。由于我们声明的类型是B类,所以在这两种情况下都调用B类的方法。现在如果我做A a = new A();
,我应该在两个答案中得到10,但我不是。我得到a.p(10)
为10,对于a.p(10.0)
为20.0。基于静态绑定的概念和通过静态绑定完成重载的整体概念,该静态绑定将查看声明的类型而不是实际的类型,为什么结果会以这种方式出现?我非常感谢你的帮助。
如果你说的是正确的,那么如果我改变我的子类方法public void p(double i){System.out(i * 3);},然后如果我调用B a = new A(),I在两种情况下都应该达到20.0,但为什么我要达到30.0?编译器为什么要查看子类方法?我会感谢你的帮助。 – Stranger
在这种情况下,您重写了动态绑定函数。在动态绑定的情况下,它的对象类型不是引用,它决定了在运行时调用哪个方法。因此,在这种情况下,您的方法调用都会调用子类中的过度使用方法。现在很明显。 – Renjith
啊!你是我的朋友。你说对了。非常感谢答案。你们好棒!! – Stranger