查了好多关于super直接的介绍,都说是执行父类的引用。但是为什么方法的局部变量表中没有这个变量呢。看代码:
public class Test extends B{
public void f(){
super.f()
}
}
class B{
public B(){
this.f();
}
public void f(){
int d=10;
}
}
编译后的字节码:
public Test();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method B."<init>":()V
4: return
LineNumberTable:
line 1: 0
public void f();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #2; //Method B.f:()V
4: return
LineNumberTable:
line 4: 0
line 5: 4
}
我们能看得出来super.f()编译成了B.f()。通过invokespecial指令可以看出虚拟机在解析阶段确定了方法调用的版本,就是类B中的f()方法。本人理解,super关键字是虚拟机在解析阶段确定方法版本的一种手段。而不是某一个具体变量变量的值
第一次发帖。说得不好敬请指教。