2011-10-29 84 views
1
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?我认为static int f被整个类共享,编译器为什么不给出这个变量被重新定义的错误消息?为什么它不会成为静态f的重复?我认为,在Java中,范围块继承其父块的变量。Java中的变量范围

回答

5

这是因为当地f,“阴影”的外部范围f。这意味着只要在本地定义它之后引用f,它就会引用本地版本。

维基百科上关于可变阴影页面使用了一个非常类似的例子在Java中:

http://en.wikipedia.org/wiki/Variable_shadowing

编辑:Grade.f:如果您需要“外” 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. 
    } 
} 
+0

谢谢。有什么可读的吗? –

+0

维基百科页面应该很清楚。除了知道阴影如何(以及在​​哪里)发挥作用之外,没有什么别的了。 – Mysticial

+0

@ArtemMoskalev Java语言问题的官方来源是Java语言规范(又名JLS)。有关您的问题,请参阅第6.3.1节。 http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.1 –

0

即使变量是静态的,作用域告诉编译器该行

System.out.println(f); 

作品与内部变量,而不是更通用的一个。这是要避免的 - 以他们的名字变得混乱的方式命名变量。

+0

我想是这样的......这只是SCJP的一个问题......我有点困惑...... 。 –