8

私が持っている場合

[編集:「内部」の型定義を追加]

interface Inner{
    public void execute();
}

class Outer{
    int outerInt;
    public void hello(){
        Inner inner = new Inner(){
            public void execute(){
                outerInt=5;
            }
        }

        //later
        inner.execute();
    }
}

その特定のオブジェクトの変数を、どこから呼び出されても、そのオブジェクトが存在する限り、にinner.execute()設定するための呼び出しはありますか?それとも、変数のコピーを変更するだけで、元のオブジェクトには影響しませんか?outerInt Outer5InnerouterIntOuter

4

4 に答える 4

6

これにより、外側がキャプチャされて変更されthisます。

仕様を見る

于 2011-12-21T01:02:19.060 に答える
4

新しく明らかになった質問に答えるには(コメントから他の答えまで):

はい。すべての内部クラスとローカルクラスは、使用したことがない場合でも
、親のへの参照を持ちます。デモthis

于 2011-12-21T13:17:21.263 に答える
0

はい、そうです。ただし、外部クラスのインスタンスを使用する必要がある場合、たとえば、何らかのメソッドに渡す必要がある場合は、Outer.thisと言う必要があります。

于 2011-12-25T21:15:04.757 に答える
0

これは必ずしも真実ではありません。表示しなかったのは、Innerのクラス宣言です。InnerにouterIntというフィールドがある場合、そのフィールドは変更されます。それ以外の場合、OuterのouterIntはそうします。実行する場合:

public class Outer {

    int outerInt = 0;

    public void hello() {
        Inner inner = new Inner() {
            @Override
            public void execute() {
                outerInt = 5;
            }
        };

        // later
        inner.execute();
        System.out.println(outerInt);
    }

    public static void main(String[] args) {
        Outer o = new Outer();
        o.hello();
    }
}

class Inner {
    int outerInt;

    public void execute() {

    }
}

5ではなく0を取得します。

しかし、InnerでouterIntをコメントアウトすると、5が得られます。

于 2011-12-21T01:59:03.227 に答える