也许你会有疑问super关键字是如何暗箱操作的呢?
这个问题涉及到java虚拟机的一些机制了,我们知道java是支持多态的,那是因为具体到指令集上,是invokevirtual指令支持多态的!而invokespecial是不支持多态的!
我们通过使用super关键字发出方法调用时,指令就被编译器编译成了invokespecial指令(发出方法调用的对象依然是this指向的实例)
例子:
public class Parent { public void test(){ } public void test1() { test(); } } public class Child extends Parent { public void test() { super.test(); } public static void main (String[]args){ new Child().test(); new Child().test1(); } }
查看编译后的结果:
其中Child的Test方法体编译为如下内容
aload_0 invokespecial #15(superdemo/Parent.test) return
其中aload_0是将this这个引用压入栈。(也证明了发出方法调用的依然是this)
#15指向常量池中索引值为15的常量,是一个CONSTANT_Methodref_info类型的常量。其代表superdemo包中Parent类的test方法(这里这两个类所在包为superdemo)
通俗一点来说
super.test();
被jvm变成了
Parent p=this; p.test();
但是需要被编译为invokespecial。