new操作符在Java中用于创建对象的新实例。创建对象的过程包括内存分配、字段初始化和调用构造函数。
在经典编程语言中,内存分配和对象初始化可以分开进行。在Java中,它们被结合在一起并由虚拟机(JVM)控制,这减少了错误和内存泄漏的数量。
对创建对象时发生的过程的误解可能导致不正确的初始化、内存泄漏或意外行为。
使用new操作符时:
代码示例:
Person p = new Person("Ivan", 20);
之后内存中会出现一个单独的Person对象,可以使用。
关键特性:
在创建对象时可以避免使用new操作符吗?
可以。例如,在克隆(clone())、反序列化、使用反射(Class.newInstance())时,但它们有自己的细微差别和限制。
new会在字符串池中创建新对象吗?
不会。如果以这种方式创建字符串:new String("abc"),将在堆中创建一个新对象,即使字符串池中已经存在这样的字符串。最好使用字符串字面量。
新操作符在数组中的行为是否不同?
是的。对于数组,new操作符为所有数组元素分配内存并用默认值初始化它们,但不调用元素的构造函数(如果这些元素不是基本类型)。
String[] arr = new String[5]; // 所有元素将为null
开发者写道:
String s1 = new String("hi"); String s2 = new String("hi"); System.out.println(s1 == s2); // false
优点:
缺点:
开发者写道:
String s1 = "hi"; String s2 = "hi"; System.out.println(s1 == s2); // true
优点:
缺点: