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

オブジェクトが可変である場合、匿名内部クラスの外部のオブジェクトを変更できます。ただし、最終として宣言する必要があるため、再割り当てすることはできません。

于 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 に答える