0

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

4

2 回答 2

5

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


SuperBoss 宣布 x。

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

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

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

于 2013-04-16T03:59:34.753 回答
1

当您int x = 10在子类中声明时,您会在每个人查看子类时隐藏超类变量

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

变量在运行时实际上并不是通过它们的代号存储的,因此像这样重新定义它们是行不通的 -SuperBoss#x将解析为符号表中的一个符号并Boss#x解析为另一个符号,因此它们仍然存在,如果你知道如何对付他们。

于 2013-04-16T04:02:19.863 回答