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