下面是重载的Java代码。
public class Main {
public static void main(String args[]){
Main m = new Main();
char c = 'a';
m.sum(c);
}
public void sum(int c){
System.out.println("A");
}
public void sum(Object c){
System.out.println("B");
}
}
输出为“ A”,但为什么我听不懂。
答案 0 :(得分:4)
我们正在传递一个char基元作为方法sum的参数。
之所以调用sum(int c)方法是因为char是int的子类型(char <:int),因此从char到int的转换范围越来越大。其他原语将具有类似的行为,其子类型关系由下式给出:
byte <:short <:int <:long <:float <:double;和char <:int
我认为您想知道为什么未调用方法sum(Object c)。假设我们删除方法sum(int c),现在将调用sum(Object c)。这是因为char原语将自动装箱到Character对象中,而Character是Object的子类型。
但是,在给定的代码中,自动装箱在这里不会发生,因为有一种可用的方法接受int(char的超类型),这是更可取的。
答案 1 :(得分:1)
添加到Stultuske的答案。因为char不是Object,所以它到达sum(int c)。下面的链接说明(或提供一个示例)为什么从char到int的这种转换有效。特别是“如果将char变量直接分配给int,它将返回给定字符的ASCII值。”
答案 2 :(得分:1)
在Java中,类和原始数据类型之间存在区别。所有对象(属于不同的类)都是Object类的实例,因此将转到第二个函数。但是,char和int不是Object的实例。它们不会进入第二功能。
Char是16位整数,因此将其转换为int。
通过添加第三个功能,您可以看到输出的变化,
public void sum(char c) {
System.out.println("B");
}
这是因为类型的层次结构和char本质上是一个整数,但是在显式指定char时,将执行新函数。
有关char和int的可互换使用的更多信息,请参见Java - char, int conversions