2013-08-04 46 views
3

你能幫我理解發生了什麼。 我已經寫了一本書核心Java。第一個變種就是從那裏開始的。第二個變種是我編譯progrm的嘗試。 我: Java版本 「1.7.0_21」 的Java(TM)SE運行時環境(建立1.7.0_21-B11) 的HotSpot的Java(TM)64位服務器VM(23.21建設-B01,混合模式)增強forstatement

public class Welcome 
{ 
    public static void main(String[] args) 
    { 
     String[] greeting = new String[3]; 
     greeting[0] = "Welcome to Core Java"; 
     greeting[1] = "by Cay Horstmann"; 
     greeting[2] = "and Gary Cornell"; 

     for (String g: greeting) 
     System.out.println(greeting[g]); 
    } 
} 

結果:

Welcome.java:16: error: incompatible types 
     System.out.println(greeting[g]); 
            ^
    required: int 
    found: String 
1 error 

如果我改變我的代碼:

public class Welcome 
{ 
    public static void main(String[] args) 
    { 
     String[] greeting = new String[3]; 
     greeting[0] = "Welcome to Core Java"; 
     greeting[1] = "by Cay Horstmann"; 
     greeting[2] = "and Gary Cornell"; 

     for (int g: greeting) 
     System.out.println(greeting[g]); 
    } 
} 

結果是:

Welcome.java:15: error: incompatible types 
     for (int g: greeting) 
       ^
    required: int 
    found: String 
1 error 

回答

4

enhanced for-loop中沒有獲得index。您將獲得對正在迭代的容器中的值的引用。所以,你可以直接打印它。

更改下面的語句在1 ST片段:

System.out.println(greeting[g]); 

到:

System.out.println(g); 

爲了您2 第二片段,這樣的:

for (int g: greeting) 

沒有按沒有任何意義。正如我所說,您可以獲得greeting中元素的引用副本,並且由於greeting中的元素的類型爲String,因此您的循環變量應該是String g,與第一個片段中一樣。

2

它遍歷迭代的元素。這個抽象允許我們不用擔心迭代器的內部工作(我們不再需要關於索引和內部工作,僅僅是元素)關注

for (String g: greeting) 
    System.out.println(g); 
} 

請參閱the official guide關於Java中的迭代。

0

你不需要使用greeting [g]。相反,你會說:

for (String s: greeting) { 
    System.out.println(s); 
} 

在S只是陣列中的每個元素,無需使用索引

0

增強的for循環可以節省你要遍歷數組的索引亂搞通過它,當你只是想從頭到尾運行,沒有花哨的東西。

for (String g: greeting) 
    System.out.println(g); 

g現在是問候中的第一個元素,每個循環都會成爲下一個元素,直到它到達結尾。這就是爲什麼它說你在給它一個int時給了它一個String。

所以基本上可以節省您的打字:

for(int i = 0; i < greeting.length; i++){ 
    System.out.println(greeting[i]); 
} 

希望這是有道理的芽