当 java.lang.Double 对象在不使用构造函数调用而是使用原语进行初始化时会发生什么?它似乎有效,但我不太确定为什么。编译器是否正在进行某种隐式转换?这是使用 Java 5。
public class Foo {
public static void main(String[] args) {
Double d = 5.1;
System.out.println(d.toString());
}
}
当 java.lang.Double 对象在不使用构造函数调用而是使用原语进行初始化时会发生什么?它似乎有效,但我不太确定为什么。编译器是否正在进行某种隐式转换?这是使用 Java 5。
public class Foo {
public static void main(String[] args) {
Double d = 5.1;
System.out.println(d.toString());
}
}
这称为自动装箱,这是 Java 5 中添加的一项功能。它将自动在原始类型和包装器类型之间进行转换,例如double
(原始)和java.lang.Double
(对象包装器)。java 编译器自动转换这一行:
Double d = 5.1;
进入:
Double d = Double.valueOf(5.1);
它被称为自动装箱
基本类型的自动装箱和自动拆箱 在基本类型(如 int、boolean 及其等效的基于对象的对应物(如 Integer 和 Boolean)之间进行转换)可能需要不必要的额外编码,尤其是当转换仅用于方法调用时例如,集合 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();
后
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);
它被称为自动装箱。