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

public class SuperBoss
{
  int x = 50;

  public void changeX()
  {
   this.x  = 20;
  }
}


子类:

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
 }
}


为什么打印10张而不打印20张?

最佳答案

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



SuperBoss声明x。

当Boss声明x时,x不会成为“虚拟”字段-它成为一个超类字段中隐藏的新字段。

当您在Boss上调用changeX时(这是SuperBoss中的一种方法),SuperBoss并不了解Boss.x,并且访问x不是虚拟的,因此只能访问SuperBoss.x。

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

07-24 15:37