方法分派

本文详细介绍了Java中方法调用的过程,包括静态分派和动态分派。静态分派依赖静态类型,典型例子是方法重载,其在编译阶段即可确定。动态分派则是在运行期间根据实际类型确定方法执行版本,如方法重写。Java虚拟机的invokevirtual指令体现了动态分派的本质,即在运行时找到接收者实际类型对应的方法。
摘要由CSDN通过智能技术生成

方法调用: 确定被调用方法的版本
解析:在类加载的解析阶段,所有方法调用中的目标在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中一部分符号引用转化为直接引用(方法在实际运行时内存布局中的入口地址)。前提:编译期可知,运行期不可变,调用代码在程序代码写好编译器进行编译时就确定下来,静态方法、私有方法。
5条方法调用字节码指令:
invokestatic:调用静态方法
invokespecial:调用实例构造器方法、私有方法
invokevirtual:调用所有的虚方法
invokeinterface:调用接口方法
invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法
前4条指令,分派逻辑固化在java虚拟机内部,invokedynamic指令的分派逻辑是由用户所设定的引导方法所决定
能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段中确定唯一版本,静态方法、私有方法、实例构造器、父类方法,在类加载时就会把符号引用解析为该方法的直接引用。
非虚方法:被invokestatic和invokespecial指令调用的方法、被final修饰的方法(使用invokevirtual指令调用,但无法被覆盖)
解析调用是静态的,在类装载的解析阶段就会把涉及的符号引用全部转化为直接引用。
分派调用:揭示多态性特征的一些最基本的体现,“重写”和“重载”在java虚拟机中是如何实现的。可能是静态的,也可能是动态的。
静态分派:依赖静态类型来定位方法执行的分派动作称为静态分派,典型应用是方法重载。
静态类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值