以下两个代码给出了相同的结果,即使其中只有一个使用关键字new
:
代码1:
Integer test = new Integer(3);
代码2:
Integer test = 3;
从OOP的角度来看,两个代码之间有什么不同吗?
答案 0 :(得分:4)
使用 new keyword 实例化变量将堆内存中的变量分配为新对象,但如果使用直接初始化,则变量将存储到 JVM中汇总内存如果您声明一个具有相同值的新变量,它将引用第一个变量的值,使用直接初始化有两个好处:
注意:您应该注意使用直接初始化,因为JVM池内存的大小有限。
答案 1 :(得分:2)
这里实际发生的是编译器为行test = 3;
生成相同的字节代码,就像您编写test = Integer.valueOf(3);
一样。在Java中,这称为自动装箱。它允许将原始类型转换为Object(引用类型),反之亦然,而无需在代码中明确声明。您可以在此处详细了解:Autoboxing and Unboxing at the Oracle Java Tutorials。
在Java中,在某些时候,几乎所有对象实例都是使用new
关键字创建的,并且必须使用new
来调用构造函数,该构造函数将为内存分配并初始化一个物体的领域;它是由程序员明确地完成还是在幕后完成另一件事。例如,Integer.valueOf(3)
可以创建一个新的Integer实例,在调用时表示原始int 3,但它也可以返回对先前创建的表示3的Integer实例的旧引用,因为实例Integer类是不可变的。无论哪种方式,您都将获得对表示原始int值3的Integer对象的引用。