我很困惑,因为我认为这是指当前调用该方法的对象.
那么为什么在调用继承方法时,我的对象中的实例变量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?
简短回答:因为字段访问在Java中不是虚拟的.
SuperBoss声明x.
当Boss声明x时,x不会成为"虚拟"字段 - 它将成为一个隐藏在超类字段中的新字段.
当你在Boss上调用changeX时,这是SuperBoss中的一个方法,SuperBoss不知道Boss.x并且访问x不是虚拟的,所以它只是访问SuperBoss.x.
如果需要访问x是虚拟的,则需要提供getX方法,并覆盖Boss中的getX方法.现在,当SuperBoss的方法调用getX时,它会被重新路由到Boss中的getX.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |