2013-02-18 73 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不会为匿名块创建变量的副本。但是,匿名块内声明的变量只属于该块,并在块的末尾被销毁。

相关问题