为什么在下面的Java代码中显示此输出?

时间:2019-05-23 06:07:56

标签: java

下面是重载的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”,但为什么我听不懂。

3 个答案:

答案 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值。”

https://www.javatpoint.com/java-char-to-int

答案 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