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