1.什么是方法的重载
在Java中,同一个类下的同名方法如果参数类型相同,是无法通过编译的。因此,我们在写同名方法时会使用不同类型(类型、数量、顺序)的参数来定义,这种定义方式,我们称做方法的重载。
在一般情况下,我们会认为同名方法如果有相同的参数类型是不被允许的。而实际上,在字节码文件中,同名且同参数类型而方法返回值不同的方法是可以的,JVM虚拟机会直接选取第一个方法名以及参数类型匹配的方法。并且,它会根据所选取方法的返回类型来决定可不可以通过编译,以及需不需要进行值转换。我们可以通过字节码工具绕过编译器限制,在编译后的字节码文件上添加这样的方法。
2.方法重载在编译器中的逻辑
之所以我们可以做到方法的重载,是因为在编译的过程中,除了名称以外,编译器还会根据被调用方法的声明参数的类型进行匹配。
方法重载在Java虚拟机中的判定的两个参数是拆型装箱和可变长参数。
- 不考虑拆装箱和变长参数的情况下进行匹配,如果匹配不到,执行下个阶段
- 拆装箱后再重新进行匹配,如果还不行,执行下个阶段
- 在考虑是否有可变长参数影响再次进行匹配。
在可变长参数的干扰下,有时不能确定具体调用的是哪个方法时,参数是子类的方法会被优先选取。如
void damo(Object obj, Object... args) { ... }
和
void damo(Strin