2013-10-20 89 views
1

我知道变量作用域被块{的开始和块}的结尾包围。如果在块内声明了相同的变量,则会发生编译错误Variable already defined。但看看下面的例子。类范围变量vs方法范围变量

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无法重新声明。

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

回答

2

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

int x = this.x 
+0

是的,它只是碰巧,这是允许的。字段和变量是内存中具有相同标识符的不同空间。海事组织不应该被允许,没有人应该这样做。 – Radiodef

2

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

0

下面是java范围的一个很好的例子(来自OCA java SE-7)。这里z(类变量)在方法内部初始化,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