我有两个分别带有参数int和Integer的重载方法。 当我通过5调用打印方法时,为什么调用第一个打印方法。 如何识别要调用的方法?
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");
}
}
答案 0 :(得分:3)
public class Test
{
static void print( int a )
{
System.out.println( "Calling first print" );
}
static void print( Integer a )
{
System.out.println( "Calling second print" );
}
public static void main( String[] args )
{
print( 5 );
print( new Integer(5) );
}
}
print( 5 );
将输出调用第一个打印内容,因为您传递了5,这是前提。print( new Integer(5) );
将输出调用第二个打印内容,因为您传递了5作为整数对象,因此方法static void print( Integer a )
具有更高的值优先。
答案 1 :(得分:3)
为什么编译器将通过参数传递的原始变量与声明的原始参数绑定到方法?
因为这很有意义,所以JLS就是这样。
恰恰相反,这将是非常令人惊讶的:您传递了int
,编译器选择了将其装箱到Integer
的方法,而不是选择具有完全匹配项的方法:{{1} }参数。
类似地,当您调用int
返回print(Integer.valueOf(5))
而不是Integer.valueOf()
的{{1}}时,编译器选择的方法就是带有{{1} }作为参数。
如何识别要调用的方法?
在Java中,编译器根据传递的参数声明的类型选择它找到的最特定的方法。这里是直的。事情不是那么明显,因为比赛不是直接的。
答案 2 :(得分:2)
print( 5 );
默认情况下5是原始类型,因此它称为第一张印刷品。