码迷,mamicode.com
首页 > 其他好文 > 详细

jvm是如何进行方法的调用的

时间:2020-09-17 20:52:44      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:报错   方法内联   参数   不同   关系   执行   绑定   静态绑定   static   

jvm是如何进行方法的调用的?        
    方法重载:方法名相同,参数类型不同的一组方法的关系,叫做方法重载。在编译阶段就能够确定具体调用哪个重载方法。
    方法重写:子类方法跟父类的方法名参数类型一样,叫做方法重写。会根据调用者的动态类型选取实际的目标方法。
        java虚拟机会根据方法描述判断方法是否重写。非私有,非静态,参数类型,返回值相同才会被jvm判定为重写。

    静态绑定,在类加载的解析阶段能够确认目标方法。
        invokestatic 静态方法
        invokespecial 私有方法,构造方法。接口的默认方法。
    动态绑定,在运行时才确定的目标方法。有点编译看左边,运行看右边的味道。
        invokevirtual  非私有实例方法
        invokeinterface  接口方法
        invokedynamic  动态方法
        
    类加载的解析阶段详解:
        如何转换?:对于类和接口,将符号引用解析成为实际引用的流程有所差异,但是大体是。
        先找自己类中符合的方法,没有就找父类,直到Objec类。还是没有,就找接口非静态,非私有方法。找不到就报错。
        
        对于静态绑定的方法而言,实际引用就是目标方法的内存地址,对于动态绑定的方法,实际引用就是方法表的索引。
        
    虚方法
        编译为这两个invokevirtual  invokeinterface指令的方法,叫做虚方法。
        被final修饰的虚方法,可以静态绑定。其余的虚方法,依靠方法表实现
        
    方法表
        在类加载的解析阶段,会构造一个方法表
        方法表包含自己和父类的所有方法。子方法表的方法索引值与重写的父类方法的索引值相同(重写时指向自己的方法)。
        java虚拟机在运行时,根据调用者的实际类型,在该类型的方法表中找到要执行的方法。
    
    虚方法调用的优化(即时编译优化)
        内联缓存
            java虚拟机只采用了单态内联缓存。只缓存一种动态类型和目标方法。命中则返回目标方法,否则退化为方法表查找。
        方法内联

jvm是如何进行方法的调用的

标签:报错   方法内联   参数   不同   关系   执行   绑定   静态绑定   static   

原文地址:https://www.cnblogs.com/haiqichen/p/13645849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!