繁体   English   中英

Java对象初始化-何时需要?

[英]Java object initialization - When is it necessary?

我对Java初始化感到好奇:
什么时候需要初始化这样的对象:

String init = new String("");

哪些对象(如字符串)不必像上面那样初始化?

String init = "";

根据您对问题的评论:

然后我的问题是哪些对象需要“ new Object()”初始化?

您是在问构造 ,而不是初始化。

所有对象都需要由某人构造。 由字符串文字创建的字符串由JVM构造。 基本上,您永远都不想使用new String("text content here")

JVM还构造了其他几个对象,例如您加载的每个类的Class对象。 但是,除了String ,对于要与之交互的对象,通常要么必须显式地构造它们(通过new ),要么从构造它们的方法中接收它们。 String的情况比较特殊,因为它是在Java中的唯一对象类型(我认为 )用文字符号。 (所有其他文字,如42false ,都是原语。)

基本上,您提到的两种初始化方法之间有细微的差别:使用时:

String str = new String("");

在堆上创建一个新的String对象,并且str指向该对象。

但在后一种情况下:

String str = "";

如果字符串池上已经存在一个带有该值(“”)的字符串 ,则引用将初始化为指向它,并且不会创建新对象。 如果在字符串池中找不到该字符串,则会在字符串池中创建一个新字符串,并初始化str指向它。

对于字符串,您几乎总是想使用第二种形式。 在大多数情况下,即使结果相同,它所做的工作也较少。

同样的建议适用于数字类,例如IntegerDouble等。

在所有其他情况下,您通常没有选择权,而必须使用第一种形式。

在Java中,必须初始化所有对象。 第二种情况init = ""也是一个初始化,除了编译器使您避免显式调用:对象创建仍然存在。 从Java 5开始,编译器还“了解” Java原语的包装器,使您可以在需要包装器类的表达式中使用原语常量(这称为autoboxing )。

所有局部变量必须显式初始化,而成员字段可以隐式初始化为null或原语的默认值。

所有对象都必须用new初始化,但有些要初始化,例如:

 String myString= "";
 Integer myInteger= 2;
 Float myFloat= 2f;
 Double myDouble= 2d;
 Byte myByte = 2;

以及每种类型的数组,都可以像`T [] array = {//列出一些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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM