3

你能帮我理解发生了什么吗?我拿了一本书Core Java。第一个变体来自那里。第二个变体是我尝试编译程序。我有:java 版本“1.7.0_21”Java(TM) SE 运行时环境(构建 1.7.0_21-b11)Java HotSpot(TM) 64 位服务器 VM(构建 23.21-b01,混合模式)

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

4 回答 4

4

你没有得到index一个增强的 for-loop。您将获得对正在迭代的容器中的值的引用。因此,您可以直接打印它。

在您的第一个片段中更改以下语句:

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

至:

System.out.println(g);

对于您的第二个片段,这是:

for (int g: greeting)

根本没有意义。正如我所说,您获得了对 in 中元素的引用副本greeting,并且由于 in 中的元素greeting属于 type String,因此您的循环变量应该String g与第一个片段中的一样。

于 2013-08-04T17:50:18.973 回答
2

它遍历可迭代对象的元素。这种抽象让我们不必担心可迭代对象的内部工作(我们不再需要关心索引和内部工作,只需关心元素)。

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

请参阅Java 迭代的官方指南

于 2013-08-04T17:50:11.423 回答
0

你不需要使用问候[g]。相反,你会说:

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

s 只是数组中的每个元素,不需要使用索引

于 2013-08-04T17:51:02.840 回答
0

增强的 for 循环可以让您避免弄乱要迭代的数组的索引,当您只想从头到尾运行而没有花哨的东西时。

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

g 现在是 greeting 中的第一个元素,并且每个循环它将成为下一个元素,直到它到达末尾。这就是为什么它说你在它期待一个 int 时给了它一个 String。

所以基本上它可以节省你输入这个:

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

希望这是有道理的芽

于 2013-08-04T18:16:28.160 回答