class A {
int i = 1;
int f() { return i; }
}
class B extends A {
int i = 2;
int @Override f() { return -i; }
}
public class override_test {
public static void main(String args[]) {
B b = new B();
A a = (A) b; // Cast b to an instance of class A.
System.out.println(a.i); // Now refers to A.i; prints 1;
System.out.println(a.f()); // Still refers to B.f(); prints -2;
}
}
我想知道为什么 a.f() 仍然引用 B.f() 而 a.i 引用 A.i。
提前致谢!
最佳答案
在 java 中字段不是多态的,这就是为什么 a.i
引用 A.i
虽然 a.f()
引用 B.f()
因为 b
是一个对象 ob B
,但你将其强制转换为 A
意味着您将只能使用 A
中声明的那些方法。
但是该对象仍然是B
类型。
因此,当您访问字段时,它基于引用类型,而当您访问方法时,它基于对象类型
关于java - 将子类转换为父类(super class)后调用方法的有趣行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912847/