2012-08-17 87 views
1

當分配從右到左發生時,爲什麼以下不會給編譯器錯誤?java中的變量初始化和聲明問題

String str = str = ""; 
+0

它爲我編譯 – 2012-08-17 11:22:34

+0

你爲什麼認爲應該給錯誤? – roni 2012-08-17 11:29:07

+0

@ roni:原因我認爲str(第二個)尚未被聲明或初始化。我們一定有什麼問題。我想知道那是什麼? – namalfernandolk 2012-08-17 11:37:35

回答

2

行爲是由Java Lanaguage Specification #15.1有關賦值運算符定義取代它。即(重點煤礦):

否則,需要三個步驟:

  • 首先,左邊的操作數進行評估,以產生可變的。如果此評估突然完成,則由於同樣的原因,分配表達式會突然完成;右側的操作數不會被評估,也不會進行分配。
  • 否則,評估右側操作數。如果此評估突然完成,則由於同樣的原因,分配表達式會突然完成,並且不會進行分配。
  • 否則,將右側操作數的值轉換爲左側變量的類型,將值集轉換(第5.1.13節)轉換爲相應的標準值集(而不是擴展指數值設置),並將轉換結果存儲到變量中。

所以表達式str = str = "";的評價是由右至左,但左邊的操作數String str第一個被評估,並創建變量。

+0

只是爲了建立這個...首先創建str的變量引用(String str),然後評估下一個部分 - str = str將str的現有引用傳遞給str。然後在第三部分中創建一個新的String對象(「」等同於新的String()),然後將其分配給str的引用。所以這是一個完全有效的方案 - 雖然是多餘的。 – Dan 2012-08-17 12:09:03

0

Java允許從右向左分配對象。

以下代碼清楚地顯示了這一點。

String a; 
String b; 
String c; 
String str = a = b = c = "Hello World!"; 

沒有什麼像第二個字符串。

String str = str = ""; // There is only 1 str here and it is declared properly.Thus the compiler doesnt give any error. 

String str = a = ""; // This will give Error Though since a is undeclared 
+0

在這之前你已經宣佈了a,b,c之前,你不是嗎? – namalfernandolk 2012-08-17 11:39:42

+0

當然是。我們應該聲明變量。 JAVA只支持這種方式的分配。 – Byter 2012-08-17 11:53:22

+0

@ Byter:是Byter。但在我的例子中,看起來第二個str還沒有被宣佈,並且你將要「」到第二個str,它現在還沒有被聲明。告訴我什麼是我的錯。爲什麼? – namalfernandolk 2012-08-17 12:01:25

0

編譯器爲您生成Assignment to variable str has no effect一個警告,這意味着編譯器簡單地

String str = ""; 
0

根據paragraph 6.3 of Java Language specification,允許在其自己的初始值設定項中使用(局部)變量。

局部變量聲明的塊中的範圍(§14.4)是 其餘在其中出現的聲明的塊,開始 其自己初始化和包括任何進一步說明符到 右邊的在局部變量聲明語句中。

在初始化之前不允許讀取變量,但該語句不會執行該操作。