我对java初始化很好奇:
什么时候需要初始化这样的对象:
String init = new String("");
哪些对象——比如字符串——不必像上面那样初始化?
String init = "";
我对java初始化很好奇:
什么时候需要初始化这样的对象:
String init = new String("");
哪些对象——比如字符串——不必像上面那样初始化?
String init = "";
根据您对问题的评论:
那么我的问题是哪些对象需要“new Object()”初始化?
你问的是构造,而不是初始化。
所有对象都需要由某人构建。由字符串字面量创建的字符串由 JVM 构造。你基本上永远不想使用new String("text content here")
.
JVM 还构造了其他几个对象,例如Class
您加载的每个类的对象。但除了 之外String
,对于您想要与之交互的对象,您通常要么必须显式构造它们(通过new
),要么从构造它们的方法中接收它们。String
有点特别,因为它是 Java(我认为)中唯一带有文字符号的对象类型。(所有其他文字,如42
or false
,都是原语。)
基本上,您提到的两种初始化方式之间存在细微差别:当您使用时:
String str = new String("");
在堆上创建一个新String
对象并str
指向它。
但在后一种情况下:
String str = "";
如果字符串池中已经存在具有此值 ("") 的字符串,则将引用初始化为指向它,并且不会创建新对象。如果在字符串池中没有找到,则在字符串池中创建一个新字符串并str
初始化为指向它。
对于字符串,您几乎总是希望使用第二种形式。对于大多数情况下相同的结果,它的工作量较小。
同样的建议也适用于数字类,例如Integer
,Double
等。
在所有其他情况下,您通常没有选择,必须使用第一种形式。
在 Java 中,必须初始化所有对象。第二种情况init = ""
也是初始化,除了编译器允许您避免显式调用:对象创建仍然存在。从 Java 5 开始,编译器还“了解”Java 原语的包装器,允许您在需要包装器类的表达式中使用原始常量(这称为自动装箱)。
所有局部变量都必须显式初始化,而成员字段可以隐式初始化null
为原语的默认值。
所有对象都必须初始化,new
但有些对象,例如:
String myString= "";
Integer myInteger= 2;
Float myFloat= 2f;
Double myDouble= 2d;
Byte myByte = 2;
以及各种数组,可以像 `T[] array = {//list some Ts};
String s1 = "1";
String s2 = new String("2");
int i1 = 1;
int i2 = new Integer(2);
long l1 = 1l;
long l2 = new Long(2l);
float f1 = 1f;
float f2 = new Float(2f);
double d1 = 1d;
double d2 = new Double(2d);
char c1 = '1';
char c2 = new Character('2');
byte b1 = 1;
byte b2 = new Byte((byte) 2);
int[] a1 = {1};
int[] a2 = new int[] {2};
大多数类需要显式构造(新的),但是有一些类不需要,这些是自动装箱类(String、Integer、Double 等,以及这些类的数组(使用逗号分隔的列表初始化))和这些是唯一的!
在编译器级别发生的事情实际上只是编译器将隐式构造转换为显式构造(例如,使用 new 的构造)
所有对象都需要在使用之前进行初始化。您可以尝试声明:
int myPrimitiveInt;
Integer myObjectInt;
但是 myPrimitiveInt 在你给它一个值之前不能使用,并且 myObjectInt 被隐式初始化为 null。要使用其中的任何一个(从对象中获取 null 除外),无论您是否使用构造函数,都需要给它们一个值。
myPrimitiveInt = 5;
myObjectInt = new Integer(5);
myObjectInt = 5;