【发布时间】:2015-07-18 12:11:26
【问题描述】:
以下是我对 java 中重载解析的了解:
编译器试图解析给定方法调用的过程 重载的方法定义称为重载决议。如果 编译器找不到它寻找最接近匹配的精确匹配 仅使用向上转换(向下转换永远不会完成)。
这是一个类:
public class MyTest {
public static void main(String[] args) {
MyTest test = new MyTest();
Integer i = 9;
test.TestOverLoad(i);
}
void TestOverLoad(int a){
System.out.println(8);
}
void TestOverLoad(Object a){
System.out.println(10);
}
}
正如预期的那样,输出是 10。
但是,如果我稍微更改类定义并更改第二个重载方法。
public class MyTest {
public static void main(String[] args) {
MyTest test = new MyTest();
Integer i = 9;
test.TestOverLoad(i);
}
void TestOverLoad(int a){
System.out.println(8);
}
void TestOverLoad(String a){
System.out.println(10);
}
}
输出为 8。
在这里我很困惑。如果从不使用向下转换,那么为什么要打印 8 呢?为什么编译器选择了TestOverLoad 方法,它以int 作为参数,从Integer 向下转换为int?
【问题讨论】:
-
Integer->int不是低调——它是拆箱,这是一个单独的机制。 -
因为足够接近将
Integer拆箱到int。 Java 从 Java 5 开始自动执行此操作。“自动装箱是 Java 编译器在基本类型及其相应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,以及以此类推。如果转换以其他方式进行,则称为拆箱。”
标签: java overloading unboxing