class Grade {
public static int f = 2;
public static void main(String[] args) {
for (int f = 0; f < 2; f++) {
System.out.println(f);
}
}
}
怎么会发生,“int f”会覆盖静态变量f?我认为静态int f由整个类共享,为什么编译器不会给出重新定义此变量的错误消息?为什么它不会成为静态f的副本?我认为在java中,scope块继承了它们父块的变量。
答案 0 :(得分:5)
这是因为本地f
,“遮蔽”了外部范围f
。这意味着无论何时在本地定义f
之后引用f
,它都将引用本地版本。
Wikipedia关于变量阴影的页面在Java中使用了一个非常相似的例子:
http://en.wikipedia.org/wiki/Variable_shadowing
编辑:如果您需要“外部”Grade.f
,则可以通过更合适的名称访问它:public class Grade {
public int f=0;
public void setF(int f) {
this.f = f; // setF(5) will set the “outer” f to 5.
}
}
。没有静态变量的类似示例:
{{1}}
答案 1 :(得分:0)
即使变量是静态的,作用域也会告诉编译器该行
System.out.println(f);
使用内部变量而不是更通用的变量。这是要避免的事情 - 以他们的名字令人困惑的方式命名你的变量。