2013-07-11 26 views
17

我很驚訝地看到這種行爲。無名變量聲明 - 爲什麼它有效?

這是一個錯誤還是什麼?

for(Object obj = new Object(), Integer = new Integer(300); 
    obj.toString().length()>3; 
    System.out.println("on object's loop")) { 

} //causes an infinite loop (not foreach loop, of course) 

上面的代碼編譯並運行正常,沒有任何引用new Integer(300)。爲什麼這樣?

我只想知道爲什麼Integer = new Integer(300);沒有任何參考是好的。

+1

它聲明瞭一個名爲'Integer'的新類型爲'Object'的變量,其初始值爲「新鮮的'java.lang.Integer',值爲300」。你有什麼問題? – Dirk

+1

重新打開 - 這是一個合理的問題(如果措辭可能不太好)。 (OP可能是明智的改寫標題。) –

回答

27
Object obj = new Object(), Integer = new Integer(300); 

這將創建兩個變量:

  1. objObject類型,被分配到new Object()
  2. Integer(是的,這就是名變量Object類型,被分配到new Integer(300)的。

順便提一句,這與for -loop無關;該行可以自行編譯。現在,如果,真的是;,那將是一個不同的故事。

一般情況下,我們可以構造形式的有效聲明:

Type t1 = ..., t2 = ..., t3 = ..., ...; 

這相當於

Type t1 = ...; 
Type t2 = ...; 
Type t3 = ...; 
... 
+4

啊!由於逗號,「整數」被解釋爲「對象」類型的變量名稱。(我從來沒有真正喜歡過逗號擴展的聲明,因爲他們創造了各種錯誤/混淆的機會。) –

+1

並且使用Integer作爲標識符,將這兩者混爲一談。 – kosa

+1

因爲'Integer'不是Java保留關鍵字(與'int'相反),所以它可以用作變量名稱。 –

15

我想他是問爲什麼Integer = new Integer(300)的作品。 - arshajii 2分鐘前

Integer是有效的標識符名和它的類型是Object由於

Object obj = new Object(), Integer = new Integer(300); 

即相當於

int a=2, b=4; 

obj.toString()打印該String(由類名和哈希碼),其長度> 3,所以無限循環

+0

我想他在問爲什麼'Integer = new Integer(300)'有效。 – arshajii

+0

@arshajii當然人! –

+0

@Sachin更新回答問題 –

3
String String = "foo"; 
    System.out.println(new String(String)); 

也是合法的 - 編譯器是足夠聰明弄清楚哪些是一個可變的參考,而不是。