回答
行爲是由Java Lanaguage Specification #15.1有關賦值運算符定義取代它。即(重點煤礦):
否則,需要三個步驟:
- 首先,左邊的操作數進行評估,以產生可變的。如果此評估突然完成,則由於同樣的原因,分配表達式會突然完成;右側的操作數不會被評估,也不會進行分配。
- 否則,評估右側操作數。如果此評估突然完成,則由於同樣的原因,分配表達式會突然完成,並且不會進行分配。
- 否則,將右側操作數的值轉換爲左側變量的類型,將值集轉換(第5.1.13節)轉換爲相應的標準值集(而不是擴展指數值設置),並將轉換結果存儲到變量中。
所以表達式str = str = "";
的評價是由右至左,但左邊的操作數String str
第一個被評估,並創建變量。
只是爲了建立這個...首先創建str的變量引用(String str),然後評估下一個部分 - str = str將str的現有引用傳遞給str。然後在第三部分中創建一個新的String對象(「」等同於新的String()),然後將其分配給str的引用。所以這是一個完全有效的方案 - 雖然是多餘的。 – Dan 2012-08-17 12:09:03
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
在這之前你已經宣佈了a,b,c之前,你不是嗎? – namalfernandolk 2012-08-17 11:39:42
當然是。我們應該聲明變量。 JAVA只支持這種方式的分配。 – Byter 2012-08-17 11:53:22
@ Byter:是Byter。但在我的例子中,看起來第二個str還沒有被宣佈,並且你將要「」到第二個str,它現在還沒有被聲明。告訴我什麼是我的錯。爲什麼? – namalfernandolk 2012-08-17 12:01:25
編譯器爲您生成Assignment to variable str has no effect
一個警告,這意味着編譯器簡單地
String str = "";
根據paragraph 6.3 of Java Language specification,允許在其自己的初始值設定項中使用(局部)變量。
局部變量聲明的塊中的範圍(§14.4)是 其餘在其中出現的聲明的塊,開始 其自己初始化和包括任何進一步說明符到 右邊的在局部變量聲明語句中。
在初始化之前不允許讀取變量,但該語句不會執行該操作。
- 1. 聲明和初始化全局變量
- 2. Maya MEL變量聲明和初始化
- 3. 聲明和初始化結構變量
- 4. scala - 未初始化的變量聲明
- 5. 聲明和初始化在java中
- 6. C++:變量聲明初始化順序
- 7. 初始化靜態final變量聲明與初始化在Application.OnCreate()
- 8. 變量初始化並聲明後可能尚未初始化
- 9. Java - 對象聲明和初始化
- 10. Vb.net聲明和初始化
- 11. c聲明和初始化
- 12. 在XLST中聲明和初始化變量
- 13. Java實例變量在兩個語句中聲明和初始化
- 14. 問題的實例變量初始化
- 15. C#變量的初始化問題
- 16. 未初始化的變量問題
- 17. 編程基礎:變量聲明,初始化,賦值和範圍
- 18. C++,而內部聲明和初始化變量循環
- 19. C++變量聲明和初始化規則
- 20. PIC18變量聲明和初始化失敗硬件
- 21. Java數組初始化後聲明
- 22. java:變量初始化
- 23. 初始化Java變量
- 24. Java變量值初始化
- 25. Java變量動初始化
- 26. 初始化變量java
- 27. 變量聲明的問題
- 28. Java聲明/變量範圍問題
- 29. 在構造函數或聲明中初始化變量
- 30. 在Java中沒有初始化和用法的字段聲明
它爲我編譯 – 2012-08-17 11:22:34
你爲什麼認爲應該給錯誤? – roni 2012-08-17 11:29:07
@ roni:原因我認爲str(第二個)尚未被聲明或初始化。我們一定有什麼問題。我想知道那是什麼? – namalfernandolk 2012-08-17 11:37:35