我很困惑,因为我认为这是指调用该方法的当前对象。
那么,为什么在调用继承的方法时,我的对象中的实例变量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张?

===============>>#1 票数:5 已采纳

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


SuperBoss声明x。

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

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

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

===============>>#2 票数:1

当在子类中声明int x = 10 ,您将在所有人查看子类时向所有人隐藏超类变量。

当超类调用this.x它不会查看子类,因此可以获取其自己的变量版本。

变量实际上不是在运行时通过它们的代码名称存储的,因此无法像这样重新定义SuperBoss#x将解析为符号表中的一个符号,而Boss#x将解析为另一个符号,因此它们仍然存在,如果您知道如何使用它们。

  ask by Kacy Raye translate from so

未解决问题?本站智能推荐: