Java中的Real vs Apparent类

时间:2010-09-28 01:49:46

标签: java

class A { public static void main(String[] args) 
{ A a = new A(); 
  B b = new B(); 
  A ab = new B(); 
  System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
  int x = 2; 
  int y = 3;
  A(int x) { this.x = x; } 
  A() { this(7); } } 

class B extends A { 
  int y = 4;
  B() { super(6); 
  }

嘿所有,我只是从我的课程中查看一些例子,并遇到了这个难以理解的问题 我意识到了 这段代码应该打印出来 “7 6 6 3 4 3”

但为什么ab.y等于3?不是B类的“真实”对象类型ab吗? 那会让我相信ab.y是4?

1 个答案:

答案 0 :(得分:8)

因为您是直接访问字段,而不是通过getter方法。

您无法覆盖字段,只能覆盖方法

B除了父类y中的字段A之外还有一个字段 A ab = new B(); 。这两个字段不会相互干扰,一个被拾取的字段在编译时确定(按编译器已知的类型)。

如果你说

  ab.y

然后

y
将编译

以查看在类A中声明的字段 B ab = new B(); 。这不会在运行时调度到实例的类。静态方法也是如此。

如果你这样做

B

然后你会在课程{{1}}中找到该字段。