`
只帅一次
  • 浏览: 32517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java编程思想练习题-第5章练习8-super实现详解

阅读更多

也许你会有疑问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。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics