实例变量隐藏与继承

时间:2014-03-22 17:33:26

标签: java inheritance

在下面的代码中,实例变量名为" 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?

1 个答案:

答案 0 :(得分:4)

  

在下面的代码中,为什么println(z.x)显示零值?

因为它指的是z中声明的A字段... z.x 可以的唯一字段请参阅,因为z的编译时类型为A

您创建的B实例有两个字段:A中声明的值(值为0)和B中声明的字段(具有价值2)。您创建的A实例完全无关紧要;它是一个完全独立的对象。

这是很好的理由:

  • 将您的所有字段设为私有,大大减少了将一个字段隐藏到另一个
  • 的可能性
  • 避免隐藏,即使它可能,因为它会导致混淆