簡體   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