2013-02-18 71 views
0

我懷疑JVM維護一個匿名塊的所有外部類全局變量的單獨副本。是這樣嗎? 感謝您的幫助。任何人都可以告訴我在Java中的匿名塊的範圍?

+0

什麼是「全局變量」?你的意思是一個'靜態'變量?請張貼一個小代碼片段來演示一個例子。 – Bohemian 2013-02-18 15:32:00

+0

不,這不是事實,你沒有理由懷疑。 – EJP 2013-02-18 23:06:16

回答

1

你是指一個匿名類嗎?

如果在非靜態上下文中創建匿名類的實例,則它將包含對創建它的外部類的實例的隱式引用。匿名實例將有權訪問外部類的私有字段和方法。雖然名字衝突將被解決,而贊成匿名課程。

要訪問的屬性和方法,其中有一個名稱衝突使用以下語法:

OuterClass.this.methodCall(); 

例子:

public class Outer { 

    public static void main(String[] args) { 

     Outer o1 = new Outer(1); 
     Outer o2 = new Outer(2); 

     o1.doSomething(); 
     o2.doSomething(); 

    } 

    private int i; 
    private int j = 10; 

    public Outer(int i) { 
     this.i = i; 
    } 

    public void doSomething() { 
     new Runnable() { 

      private int i = 0; 

      public void run() { 
       System.out.println("Inner i = " + i); 
       System.out.println("Outer i = " + Outer.this.i); 
       System.out.println("Outer j = " + j); 
      } 
     }.run(); 
    } 
} 
0

如果匿名內部類是可變的,您可以修改匿名內部類之外的對象。但是,您不能重新分配它們,因爲它們必須聲明爲最終。

0

我解釋你的問題是問:「當一個匿名塊更改聲明在塊之外的變量時,變量是否會在塊結束後保留​​這些更改?

我創建一個小的測試程序來演示的結果:

public class AnonymousTest { 
    private static int i = 0; 
    public static void main(String[] args) { 
     int j = 0; 
     System.out.println("Before anonymous block: i=" + i + " j=" + j); 

     //begin anonymous block 
     { 
      i = 5; j = 5; 
      System.out.println("Inside anonymous block: i=" + i + " j=" + j); 
     } 
     //end anonymous block 

     System.out.println("After anonymous block: i=" + i + " j=" + j); 
    } 
} 

的輸出是:

Before anonymous block: i=0 j=0 
Inside anonymous block: i=5 j=5 
After anonymous block: i=5 j=5 

正如你可以看到,一個匿名塊的內部修改的任何變量保持改性,所以JVM不會爲匿名塊創建變量的副本。但是,匿名塊內聲明的變量只屬於該塊,並在塊的末尾被銷燬。

相關問題