Java 方法重载在这里是如何工作的?

Java 方法重载在这里是如何工作的?,java,Java,我有两个重载方法,分别使用int和Integer参数。 当我通过传递5调用print方法时,为什么它调用第一个print方法。 它如何识别要调用的方法 public class Main { public static void main(String[] args) { print(5); } static void print(int a) { System.out.println("Calling first print");

我有两个重载方法,分别使用int和Integer参数。 当我通过传递5调用print方法时,为什么它调用第一个print方法。 它如何识别要调用的方法

public class Main {

    public static void main(String[] args) {
        print(5);
    }

    static void print(int a) {
        System.out.println("Calling first print");
    }

    static void print(Integer a) {
        System.out.println("Calling second print");
    }

}

print(5)
将输出调用first print,因为您正在传递5,这是一个前置变量。
print(新整数(5))将输出调用第二次打印,因为您将5作为整数对象传递,因此方法
静态无效打印(整数a)
具有更高的优先级。

为什么编译器将作为参数传递的基元变量绑定到具有基元声明参数的方法?
因为这是有意义的,JLS就是这样运行的。
相反,这将是非常令人惊讶的:您传递一个
int
,编译器选择将其装箱到
Integer
的方法,而不是选择具有精确匹配的方法:一个
int
参数

类似地,当调用
print(Integer.valueOf(5))
时,其中
Integer.valueOf()
返回
Integer
而不是
int
,编译器选择的方法是以
Integer
作为参数的方法

它如何识别要调用的方法

在Java中,编译器根据传递的参数声明的类型选择它找到的最具体的方法。这是直的。事情不那么明显,因为比赛不是直接的

你会感兴趣的

 print( 5 );

默认情况下,5是基元类型。因此它调用第一次打印。

因为您传递的是基元int,它会选择带有基元参数的打印。您可以使用
Integer.valueOf(5)
,它会选择第二个版本。只有当没有方法接受int参数时,才会激活int到Integer的自动装箱。国际海事组织,这更重要
 print( 5 );