1

我知道变量范围由块的开头和块{的结尾包围}。如果在块中声明了相同的变量,Variable already defined则会发生编译错误。但是看看下面的例子。

public class Test{
int x=0;// Class scope variable

public void m(){
  int  x=9;   //redeclaration of x is valid within the scope of same x. 

  if(true){
      int x=7; // but this redeclaration generates a compile time error.
  }

}

在这里,x可以在方法中重新声明,尽管它已经在类中声明。但在if街区里,x不能重新声明。

为什么重新声明类范围变量不会产生错误,但重新声明方法范围变量会产生错误?

4

3 回答 3

2

这是因为int x=0不是变量而是实例字段。允许局部变量与字段同名。为了区分变量和具有相同名称的字段,我们this对实例字段使用前缀或对类字段使用类名。例如

int x = this.x
于 2013-10-20T02:43:03.593 回答
2

因为这就是 Java 的设计方式。语言设计者可以很容易地做到这一点,因此不可能为局部变量和实例变量使用相同的名称。他们只是选择不这样做。

于 2013-10-20T02:47:53.783 回答
0

这是 java 作用域的一个很好的例子(来自 OCA java SE-7)。这里 z(class variable) 在方法 doStuff2 中被初始化。类变量可以在方法内部初始化,但如果在方法内部重新声明相同的变量,则会在堆栈而不是堆上创建一个新的局部变量。

            public class ScopeTest
            {
            int z;
            public static void main(String[] args){
            ScopeTest myScope = new ScopeTest();
            int z = 6;
            System.out.println(z);
            myScope.doStuff();
            System.out.println(z);
            System.out.println(myScope.z);
            }
            void doStuff() {
            int z = 5;
            doStuff2();
            System.out.println(z);
            }
            void doStuff2()
            {
            z = 4;
            }
            }

输出:

6 
5 
6 
4 
于 2016-02-19T18:21:58.570 回答