我有以下代码
public class Main {
public static void main(String[] args) {
Parent upCasted = new Child();
System.out.println("String: " + upCasted.getString());
System.out.println("Int: " + upCasted.a);
}
}
class Parent {
int a = 1;
public String getString() {
return "Parent";
}
}
class Child extends Parent {
int a = 2;
@Override
public String getString() {
return "Child";
}
}
当我运行它时,我会在控制台中看到它
String: Child
Int: 1
为什么在向上转换期间,int
的值是从Parent
取而String
的值是从Child?
来
答案 0 :(得分:3)
这是因为在子类中重新声明实例字段时不会覆盖。
相反,当评估upCasted.a
时,Java会查看upCasted
的静态/声明类型来知道要读取哪个类的字段(而不是在upCasted
对象的运行时类中)指向)。
这就是为什么在超类和子类中的字段不应该使用相同的名称的原因。