在父类(super class) A 和子类 B 中,我都有变量 abc 分别为 10 和 20,并且在子类中重写了一个方法 callme()。
如果我这样做
A a = new B();
B b = B(new A());
那么如果我写
a.callme() -> calls B's method
b.callme() -> calls A's method.
这是因为方法是根据实际对象调用的。
如果我这样做
str = a.abc; // will print 10 , based upon ref var type A
str = b.abc; // will print 20 , based upon ref var type B
为什么会有这种差异?为什么不根据实际对象访问方法和变量?
谢谢
最佳答案
请记住,实例变量永远不会被覆盖,它们是隐藏的。引用的类型决定了将访问谁的实例变量。
在子类中,callme()
方法被覆盖。因此,根据动态方法调度机制,对象的类型决定了在运行时将调用哪个方法。这是因为,对象是在运行时创建的。
例如
class A {
int abc = 10;
public void callme() {
System.out.println("In class A");
}
}
class B extends A {
int abc = 20; // hidden, not overidden
public void callme() {
System.out.println("In class B");
}
public static void main(String [] args) {
A a = new A();
a.callme(); // calls A's callme() method.
B b = new B();
b.callme(); // calls B's callme() method.
}
}
关于java - 为什么 java ref vars 调用基于实际对象的方法,而变量基于 ref 变量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6873446/