0

我有一个简短的程序来测试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 中是如何运行的。有什么解释吗?

4

1 回答 1

2

重载方法的方法调用将根据类型参数和您传递的实际类型调用最具体的方法。

方法调用转换遵循以下路径:

  • 身份转换:首先将搜索精确匹配的方法。如果找到,它将被调用。从一个类型到相同类型的转换。
  • 加宽原语转换:如果没有精确匹配的方法,则根据实参到格式类型参数的加宽转换来选择方法。

还有一些,但在这里不适用。有关方法调用转换,请参见JLS 5.3 。

因此,f2(x);因为类型不完全匹配char,所以调用该方法,因为可以通过扩展转换转换f2(int)为的最具体的类型是. 不,to不是扩大转换。charintcharshort

同样,对于f2(y),类型没有完全匹配,因此调用byte该方法,因为它是可以扩展到的最具体的类型。f2(short)shortbyte

请参阅JLS 5.1.2 以了解扩大基元转换

原始类型的 19 种特定转换称为扩展原始类型转换:

  • byteshort, int, long, float, 或double
  • shortint, long, float, 或double
  • charint, long, float, 或double
于 2013-09-29T08:30:53.017 回答