Java中的变量范围

时间:2011-10-29 20:52:02

标签: java

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块继承了它们父块的变量。

2 个答案:

答案 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);

使用内部变量而不是更通用的变量。这是要避免的事情 - 以他们的名字令人困惑的方式命名你的变量。