我有一个简短的程序来测试java中的重载方法。 这是我的代码:
public static void main(String[] args) {
// TODO code application logic here
// Case 1
f2(5);
// Case 2
char x = 'a';
f2(x);
// Case 3
byte y = 0;
f2(y);
// Case 4
float z = 0;
f2(z);
}
还有我的方法:
public static void prt(String s) {
System.err.println(s);
}
public static void f2(short x) {
prt("f3(short)");
}
public static void f2(int x) {
prt("f3(int)");
}
public static void f2(long x) {
prt("f5(long)");
}
public static void f2(float x) {
prt("f5(float)");
}
这就是结果:
f3(int)
f3(int)
f3(short)
f5(float)
我无法理解如何运行案例2和3.对我有什么解释?
答案 0 :(得分:2)
在重载方法的情况下,方法调用将根据类型参数和您传递的实际类型调用最具体的方法。
方法调用转换遵循以下路径:
还有更多,但不适用于此。请参阅JLS 5.3 for Method Invocation Conversion。
因此,对于f2(x);
因为char
类型没有完全匹配,所以调用方法f2(int)
,因为char
可以是最具体的类型通过加宽转化率转换为int
。 不,char
到short
不是扩大转化。
类似地,对于f2(y)
,byte
类型没有完全匹配,因此调用方法f2(short)
,因为short
是byte
最具体的类型byte
1}}可以扩展为。
请参阅JLS 5.1.2 for Widening Primitive conversions:
对原始类型的19个特定转换称为扩展 原始转换:
short
至int
,long
,float
,double
或short
int
至long
,float
,double
或char
int
至long
,float
,double
或{{1}}