为什么"错误的"实例变量会被修改?

Kac*_*aye 0 java inheritance

我很困惑,因为我认为这是指当前调用该方法的对象.
那么为什么在调用继承方法时,我的对象中的实例变量x没有被更改?超类:

public class SuperBoss 
{
  int x = 50;

  public void changeX()
  {
   this.x  = 20;
  }
}
Run Code Online (Sandbox Code Playgroud)

子类:

public class Boss extends SuperBoss
{
 int x = 10;
 public static void main(String[] args)
 {
  Boss b = new Boss();
  b.changeX();
  System.out.println(b.x); //prints 10
 }
}
Run Code Online (Sandbox Code Playgroud)

为什么打印10而不是20?

Pat*_*shu 5

简短回答:因为字段访问在Java中不是虚拟的.


SuperBoss声明x.

当Boss声明x时,x不会成为"虚拟"字段 - 它将成为一个隐藏在超类字段中的新字段.

当你在Boss上调用changeX时,这是SuperBoss中的一个方法,SuperBoss不知道Boss.x并且访问x不是虚拟的,所以它只是访问SuperBoss.x.

如果需要访问x是虚拟的,则需要提供getX方法,并覆盖Boss中的getX方法.现在,当SuperBoss的方法调用getX时,它会被重新路由到Boss中的getX.