在下面的代码中,实例变量名为" x"内部子类" B"隐藏也称为" x"的实例变量在父超类内部" A"。
public class A {
public int x;
}
public class B extends A {
public int x;
}
在下面的代码中,为什么println(z.x)显示零值?感谢。
A a = new A();
B b = new B();
a.x = 1;
b.x = 2;
A z = b;
System.out.println(z.x); // Prints 0, but why?
答案 0 :(得分:4)
在下面的代码中,为什么println(z.x)显示零值?
因为它指的是z
中声明的A
字段... z.x
可以的唯一字段请参阅,因为z
的编译时类型为A
。
您创建的B
实例有两个字段:A
中声明的值(值为0)和B
中声明的字段(具有价值2)。您创建的A
实例完全无关紧要;它是一个完全独立的对象。
这是很好的理由: