目录
一、重载定义
在同一个类中,如果多个方法拥有相同的名字、不同的参数,即称为方法重载。String类中的valueOf()就是比较著名的重载案例,可以将输入的基本数据类型、数组、Object等转换成字符串。
在JVM眼中,方法名称+参数类型+参数个数,组成一个唯一键,成为方法签名。JVM通过这个唯一键决定调用那个方法。如
public class OverloadMethods {
/**
* 1.无参
*/
public void overloadMethod(){
System.out.println("无参方法");
}
/**
* 2.基本数据类型
*/
public void overloadMethod(int param){
System.out.println("基本数据类型为int的方法");
}
}
二、重载问题
2.1、复杂重载案例
上例中很容易判断调用哪种重载方法,但是当加入包装类和可变参时,会如何呢,见下例子,调用overloadMethod(7)。
public class OverloadMethods {
/**
* 1.无参
*/
public void overloadMethod(){
System.out.println("无参方法");
}
/**
* 2.基本数据类型
*/
public void overloadMethod(int param){
System.out.println("参数为基本数据类型int的方法");
}
/**
* 3.包装类
*/
public void overloadMethod(Integer param){
System.out.println("参数为包装类Integer的方法");
}
/**
* 4.可变参,可接收0~n个Integer参数
*/
public void overloadMethod(Integer... param){
System.out.println("可变参方法");
}
/**
* 5.Object参数
*/
public void overloadMethod(Object param){
System.out.println("参数为Object的方法");
}
}
调用overloadMethod(7),到底会调用谁呢?答案是2,参数为基本数据类型int的方法。
2.2、重载调用顺序
JVM在重载方法中,选择合适的目标方法的顺序如下:
① 精确匹配
② 如果是基本数据类型,自动转换成更大范围的基本类型
③ 通过自动拆箱与装箱
④ 通过子类向上转继承路线依次匹配
⑤ 通过可变参数匹配
精确匹配优先,int和Integer胜出,因为不需要自动装箱,因此overloadMethod(7)会调用int参数的方法。如果是new Integer(7),Integer参数的方法将胜出。
如果本方法只有overloadMethod(long param),则可接收overloadMethod(7)的实参调用;反之,如果只有overloadMethod(int param),而传入long值,则会编译出错。基本数据类型转化为表示范围更大的基本数据类型优先于自动装箱,即int转为long,优先于自动装箱。
如果一个类中只有overloadMethod(Object param)和overloadMethod(Integer...param)两种方法,根据目标方法匹配顺序,overloadMethod(7)先自动装箱,然后向上转型,匹配Object。这个规则优先于调用可变参的重载方法。
如果调用overloadMethod(null),则会调用参数为Integer的方法。null可以匹配任何对对象,在查找目标方法时,是从最底层子类依次向上查找的。Integer是Object的子类,所以会先与Object匹配。
根据上次匹配顺序,可变参数在竞争中明显处于弱势地位。如果调用overloadMethod(13,14),此时有两个参数,虽然有自动装箱的开销,但可变参数仍会执行这种方法请求。
2.3、延伸思考
由上所述,7是匹配基本类型优先,new Integer(7)是匹配包装类优先,那么如下定义会怎样呢?
public void overloadMethod(int param1, Integer param2){
System.out.println("可变参方法");
}
public void overloadMethod(Integer param1, int param2){
System.out.println("可变参方法");
}
如上定义编译是可通过的,也是一种重载方式。但是此时调用overloadMethod(7,8)会出现调用出错(Ambiguous method call. Both两者都匹配,引用不明确)。