返回信息流看到枚举类时遇到这样一个问题,麻烦大家来给解个惑。
import java.util.*;
public class CoinTest
{
private enum Coin
{
ONE, TWO, THREE, FOUR, FIVE, SIX
}
public static void main(String args[])
{
for(Coin c : Coin.values())
{
System.out.println(c + ", ordinal: " + c.ordinal());
}
}
}
上面这段代码的编译和执行都是正常的,但如果把for中的c的定义提到外面(代码如下),就会编译不通过,这是为什么呢?
import java.util.*;
public class CoinTest
{
private enum Coin
{
ONE, TWO, THREE, FOUR, FIVE, SIX
}
public static void main(String args[])
{
Coin c;
for(c : Coin.values())
{
System.out.println(c + ", ordinal: " + c.ordinal());
}
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #25994同步于 2013/6/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求教:关于foreach中对象声明的位置问题
cosmicdust
2013/6/22镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
EnhancedForStatement:
for ( FormalParameter : Expression ) Statement
FormalParameter:
VariableModifiersopt Type VariableDeclaratorId
VariableDeclaratorId:
Identifier
VariableDeclaratorId []
只能说Java语言规范里就是这么定义的,这种其实也没有什么为什么。。如果将来 你能够参与到规范的制定里面,或许你可以提议修改一下 。。
收到,谢谢啦~ 之前把foreach错误当成了for的一种特殊用法。
【 在 qazwsxedc 的大作中提到: 】
: EnhancedForStatement:
: for ( FormalParameter : Expression ) Statement
:
: ...................
具体不清楚,从javap的结果
public static void main(java.lang.String[]);
Code:
Stack=3, Locals=5, Args_size=1
0: invokestatic #16; //Method CoinTest$Coin.values:()[LCoinTest$Coin;
3: dup
4: astore 4
6: arraylength
7: istore_3
8: iconst_0
9: istore_2
10: goto 53
13: aload 4
15: iload_2
16: aaload
17: astore_1
18: getstatic #22; //Field java/lang/System.out:Ljava/io/PrintStream;
21: new #28; //class java/lang/StringBuilder
24: dup
25: invokespecial #30; //Method java/lang/StringBuilder."<init>":()V
28: aload_1
29: invokevirtual #31; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
32: ldc #35; //String , ordinal:
34: invokevirtual #37; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
37: aload_1
38: invokevirtual #40; //Method CoinTest$Coin.ordinal:()I
41: invokevirtual #44; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
44: invokevirtual #47; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
47: invokevirtual #51; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
50: iinc 2, 1
53: iload_2
54: iload_3
55: if_icmplt 13
58: return
LineNumberTable:
line 12: 0
line 14: 18
line 12: 50
line 16: 58
似乎是只是从static里面读取,然后从iinc 2, 1 进行自增,并没有new一个Coin类型的对象,所以,这个c应该是一个引用,声明在外面似乎是不行的