2014-10-08 140 views
-1

從我所知,初始化變量是當您爲其設置值時。例如:本地變量字符串可能尚未初始化特性

String s;  // declaring the String (throws an error if you use in conditionals) 
String s = null; // declaring and then initializing the String (no error) 

然而,當String聲明,是不是自動初始化爲null?因此,編譯器不應該拋出錯誤。

我還注意到String s = new String();與條件一起使用時不會產生任何錯誤,但String s;不會產生任何錯誤。我認爲這兩種說法基本上是一樣的,後者甚至比前者更受鼓勵。

我的問題是,爲什麼String s = new String();工作,但不是String s;(當使用條件來設置它們的值)?不應該將這兩個字符串自動初始化爲null,因此不會導致錯誤?

獎勵問題:由於String對象被自動初始化爲null,爲什麼以下代碼打印出空的String

String s = new String(); 
System.out.println(s); 

編輯:顯然,我不覺得直,當我累了。這整個問題是一團糟,我不知道我在想什麼。向那些不得不嘗試理解的人道歉。

此外,Oracle docs上的默認值:

局部變量是略有不同;編譯器從不將默認值分配給未初始化的局部變量。如果你不能初始化聲明它的局部變量,確保在你嘗試使用它之前給它賦值。訪問未初始化的本地變量將導致編譯時錯誤。

其中回答了上述問題。

+2

你的問題與其他人沒有什麼不同。如果在類中聲明瞭**,則String將初始化爲'null' **。並且'new String()'按照你所期望的那樣創建一個String對象,而不是null。在這裏看到沒什麼不尋常的 – 2014-10-08 21:21:09

+0

String s = new String();相當於String s = new String(「」);所以在第一種情況下s不爲空。 – ToYonos 2014-10-08 21:25:00

+1

投票結束只是這個問題的許多重複之一。 「獎金」問題是一個非問題,並且不需要重複,因爲它在Java書第一章的任何介紹中都有答案。 – 2014-10-08 21:28:41

回答

5

但是,當聲明一個字符串時,是不是會自動初始化爲空?因此,編譯器不應該拋出錯誤。

不,這隻適用於級別變量。局部變量沒有被賦予默認值,但需要顯式初始化。

由於String對象會自動初始化爲null,爲什麼下面的代碼打印出一個空的String?

String對象永遠不會初始化爲null。另一方面,級別String引用