之前写过一篇关于重载方法的。
http://blog.youkuaiyun.com/uncle_gy/article/details/78006215
示例代码:
import java.io.Serializable;
import java.lang.Comparable;
public class Overload{
public static void sayHello(Object arg){
System.out.println("Hello Object");
}
public static void sayHello(byte arg){
System.out.println("Hello byte");
}
public static void sayHello(short arg){
System.out.println("Hello short");
}
public static void sayHello(char arg){
System.out.println("Hello char");
}
public static void sayHello(int arg){
System.out.println("Hello int");
}
public static void sayHello(long arg){
System.out.println("Hello long");
}
public static void sayHello(float arg){
System.out.println("Hello float");
}
public static void sayHello(double arg){
System.out.println("Hello double");
}
public static void sayHello(Character arg){
System.out.println("Hello Character");
}
public static void sayHello(char... arg){
System.out.println("Hello char...");
}
public static void sayHello(Serializable arg){
System.out.println("Hello Serializable");
}
public static void sayHello(Comparable<Character> arg){
System.out.println("Hello Comparable<Character>");
}
public static void main(String[]args){
sayHello('a');
}
}
输出结果1:
此时输出结果是:Hello char
如果注释掉参数是char的方法则输出结果是:Hello int
如果再注释掉参数是int的方法则输出结果是:Hello long
如果再注释掉参数是long的方法则输出结果是:Hello float
如果再注释掉参数是float的方法则输出结果是:Hello double
结果分析1:
因为此时char类型的'a'
除了可以代表有个字符串还可以代表数字97索引如果注释掉参数为char的方法则会自动转型到int。
如果继续注释则会按照:
char
→
int
→
long
→
float
→
double的顺序进行匹配。但是它始终不会匹配到byte和short参数的方法,因为char到byte和short的转型是不安全的。
输出结果2:
如果继续注释只保留:
public static void sayHello(Character arg){
System.out.println("Hello Character");
}
public static void sayHello(char... arg){
System.out.println("Hello char...");
}
public static void sayHello(Serializable arg){
System.out.println("Hello Serializable");
}
public static void sayHello(Comparable<Character> arg){
System.out.println("Hello Comparable<Character>");
}
输出结果为:Hello Character
此时如果再次注释掉参数为Character的方法可以发现编译器报出如下错误:
如果注释掉参数为Serializable
或者Comparable<Character>
中的一个则输出结果为:
Hello Comparable<Character>
或者Hello Serializable
如果把参数为Serializable
或者Comparable<Character>
的方法都注释掉则输出结果为:
Hello char...
结果分析2:
在没有了基本类型参数的方法或者没有类型安全的基本类型参数方法不存在的情况下会产生依次装箱操作,char
→
Character
在没有了参数为Character的方法的情况下,会找不到装箱类,但是如果找到了装箱类实现的接口类型则同样可以实现匹配(这里应该是上转型)Character类实现的接口:
可以看到一共实现了两个接口Serializable
和Comparable<Character>
,此时以Serializable
或者Comparable<Character>
的方法优先级相同。编译器无法确定要使用的静态类型,于是报错。如果想使用必须显示指明,比如:sayHello(Serializable 'a');
变长参数类型char
…
的优先级是最低的,如果只剩下参数为char
…
参数的方法则输出结果就是:Hello char...