有人可以帮我理解为什么输出以下代码,在java中:
public class Main {
public static int position1, position2;
private enum Direction{
North(1,1),
South(-1,-1),
West(-1,0),
East(1,0);
Direction(int i, int j){
position1=i;
position2=j;
}
}
public static void main(String[] args){
for(Direction d: Direction.values()){
System.out.println(d + " has coordinates (" + position1 + "," + position2 + ")");
}
}
}
输出结果为:
North has coordinates (1,0)
South has coordinates (1,0)
West has coordinates (1,0)
East has coordinates (1,0)
这就是,始终使用元素East的参数调用构造函数。为什么会这样?我似乎无法在任何地方找到这个解释。
答案 0 :(得分:2)
position1
和position2
为static
,Main
类。这意味着他们在全球范围内只为使用Main
的任何人提供了每个字段的一个版本。你想要的是 Direction
上的实例字段。 Java tutorial on member fields还有更多信息。
private enum Direction {
public int position1, position2;
...
}
您需要删除static
关键字,以便每个Direction
都有自己的position1
和position2
值。您可能还希望将它们标记为final
,这意味着它们只能设置一次(这是一个很好的通用做法,出于各种原因:更容易推理状态,捕获像这样的错误意外覆盖值,使线程安全的代码等。)
当您访问它们时,您需要指定要获取该位置的实例:
d.position1
(而不只是position1
)
发生这种情况的原因是,当您第一次使用Direction
枚举时,JVM会加载其四个值中的每一个。为此,每个值都运行其构造函数。例如,当它加载North
时,它会运行North(1, 1)
,并设置position1 = 1; position2 = 1
。然后,当它加载South
时,它会运行South(-1, -1)
,然后设置position1 = -1; position2 = -1;
。由于每个字段只有一个版本(static
的作用),因此South
构造函数只会覆盖North
构造函数所写的值。最终结果是,您将获得最后运行的任何构造函数的position1
和position2
值。由于枚举值按照它们在代码中出现的顺序加载,因此该构造函数是最后一个值的值:East
。
答案 1 :(得分:0)
是。当您的意图显然是 instance 字段时,您正在使用static
字段。传递给构造函数的值全部覆盖了最后使用的值。
删除"静态"并将它们移到枚举中:
private enum Direction{
North(1,1),
South(-1,-1),
West(-1,0),
East(1,0);
public int position1, position2;
Direction(int i, int j){
position1=i;
position2=j;
}
}
现在请参考枚举实例的字段:
public static void main(String[] args){
for(Direction d: Direction.values()){
System.out.println(d + " has coordinates (" + d.position1 + "," + d.position2 + ")");
}
}
我会创建字段final
- 否则可以更改字段:
public final int position1, position2;
答案 2 :(得分:0)
static
不是您唯一的问题,您的位置字段的位置也不正确。试试这个:
public class Main {
private enum Direction{
North(1,1),
South(-1,-1),
West(-1,0),
East(1,0);
public final int position1;
public final int position2;
Direction(int i, int j){
position1=i;
position2=j;
}
}
public static void main(String[] args){
for(Direction d: Direction.values()){
System.out.println(d + " has coordinates (" + d.position1 + "," + d.position2 + ")");
}
}
}