class Sup {
int a = 9;
public void printA(){
System.out.println(a);
}
}
class Sub extends Sup{
int a = 90;
public static void main(String[] args){
Sub s = new Sub();
s.printA(); // 9
}
}
我一开始的理解是这样的,当对象调用非静态方法的时候会隐式传递一个 this, 所以 s.printA() 就传递了一个 this, printA 方法相当于
public void printA(){
System.out.println(this.a);
}
这了this引用的对象应该是 s ,也就是子类对象,输出应该是 90。 为何会是 9呢?
上几张图
这个是
Sub
子类的class文件,根据字节码显示(注意看我圈圈的部分),这里调用的是父类的printA
方法(Sup.printA
)。这个很好理解,因为Sub
类作为子类继承了父类Sup
,自然会拥有父类的public
的方法。Sub
类的main
方法中调用的是父类的printA
方法这个是父类的class文件,同样请注意圈圈的部分,
printA
调用的a
变量是父类的变量(Sup.a
),所以说打印的是9