0

我怀疑 JVM 为匿名块维护了所有外部类全局变量的单独副本。这是真的吗?谢谢你帮助我。

4

3 回答 3

2

你的意思是匿名类?

如果在非静态上下文中创建匿名类的实例,那么它将包含对创建它的外部类实例的隐式引用。匿名实例将有权访问外部类的私有字段和方法。尽管名称冲突将有利于匿名类的解决。

要访问存在名称冲突的字段和方法,请使用以下语法:

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();
    }
}
于 2013-02-18T15:38:48.337 回答
0

如果对象是可变的,您可以修改匿名内部类之外的对象。但是,您不能重新分配它们,因为它们必须被声明为 final。

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

于 2013-02-18T15:38:42.610 回答