2013-10-20 117 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