Java中的Real vs Apparent类

Kev*_*hou 6 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); 
  }
Run Code Online (Sandbox Code Playgroud)

嘿所有,我只是通过我的课程中的一些例子,并遇到了困扰我的这个问题.
我意识到这段代码应打印出来"7 6 6 3 4 3"

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

Thi*_*ilo 8

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

您不能覆盖字段,只能覆盖方法.

除了父类中的类之外,类B还有一个字段.这两个字段不会相互干扰,一个被拾取的字段在编译时确定(通过编译器已知的类型).yA

如果你说

   A ab = new B(); 
Run Code Online (Sandbox Code Playgroud)

然后

  ab.y
Run Code Online (Sandbox Code Playgroud)

将被编译以查看y在类中声明的字段A.这不会在运行时调度到实例的类.静态方法也是如此.

如果你这样做

    B ab = new B();
Run Code Online (Sandbox Code Playgroud)

然后你在课堂上得到了这个领域B.