JVM虚拟机解析——方法重载与重写

本文详细介绍了Java虚拟机中的方法重载与重写。方法重载在编译器层面实现,根据参数类型进行匹配;而方法重写在JVM中通过方法名、方法描述符来判断。重载是静态绑定,重写是动态绑定。文章还讨论了方法表、符号引用、静态绑定与动态绑定的原理,以及优化技术——内联缓存,以提高动态绑定效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是方法的重载

在Java中,同一个类下同名方法如果参数类型相同,是无法通过编译的。因此,我们在写同名方法时会使用不同类型(类型、数量、顺序)的参数来定义,这种定义方式,我们称做方法的重载。

在一般情况下,我们会认为同名方法如果有相同的参数类型是不被允许的。而实际上,在字节码文件中,同名且同参数类型而方法返回值不同的方法是可以的,JVM虚拟机会直接选取第一个方法名以及参数类型匹配的方法。并且,它会根据所选取方法的返回类型来决定可不可以通过编译,以及需不需要进行值转换。我们可以通过字节码工具绕过编译器限制,在编译后的字节码文件上添加这样的方法。

2.方法重载在编译器中的逻辑

之所以我们可以做到方法的重载,是因为在编译的过程中,除了名称以外,编译器还会根据被调用方法的声明参数的类型进行匹配。

方法重载在Java虚拟机中的判定的两个参数是拆型装箱和可变长参数。

  1. 不考虑拆装箱和变长参数的情况下进行匹配,如果匹配不到,执行下个阶段
  2. 拆装箱后再重新进行匹配,如果还不行,执行下个阶段
  3. 在考虑是否有可变长参数影响再次进行匹配。

在可变长参数的干扰下,有时不能确定具体调用的是哪个方法时,参数是子类的方法会被优先选取。如
void damo(Object obj, Object... args) { ... }
void damo(Strin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值