在没有使用构造函数的调用而是使用原语的情况下初始化java.lang.Double对象时会发生什么?它似乎工作,但我不太清楚为什么.编译器是否存在某种隐式转换?这是使用Java 5.
public class Foo {
public static void main(String[] args) {
Double d = 5.1;
System.out.println(d.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
kro*_*ock 10
这称为Autoboxing,它是Java 5中添加的一项功能.它将自动在基本类型和包装类型(如double原语)和java.lang.Double(对象包装器)之间进行转换.java编译器自动转换行:
Double d = 5.1;
Run Code Online (Sandbox Code Playgroud)
成:
Double d = Double.valueOf(5.1);
Run Code Online (Sandbox Code Playgroud)
它被称为AutoBoxing
原始类型的自动装箱和自动拆箱在原始类型之间进行转换,如int,boolean及其等效的基于对象的对应方(如Integer和Boolean),可能需要不必要的额外编码量,特别是如果只需要对方法调用进行转换例如,Collections API.
Java原语的自动装箱和自动拆箱产生的代码更简洁,更易于遵循.在下一个示例中,正在存储一个int,然后从ArrayList中检索它.5.0版本保留了转换为Integer并返回编译器所需的转换.
之前
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = (list.get(0)).intValue();
Run Code Online (Sandbox Code Playgroud)
后
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);
Run Code Online (Sandbox Code Playgroud)