14

メソッド内で定義されたメソッドがそれを使用する必要があるかのように、なぜ a を宣言する必要がlocal variableあるのですか?finalInner class

例 :

class MyOuter2 {

private String x = "Outer2";

void doStuff() {
    final String y = "Hello World";

    final class MyInner {

        String z = y;

        public void seeOuter() {
            System.out.println("Outer x is "+x);
            System.out.println("Local variable is "+y);
            MyInner mi = new MyInner();
            mi.seeOuter();
        }
    }
}

}

Stringyが最終的な定数である必要があるのはなぜですか? どのように影響しますか?

4

6 に答える 6

17

ローカル変数は常にスタック上に存在し、メソッドが終了した瞬間にすべてのローカル変数がなくなります。

ただし、メソッドが終了した後でも内部クラスオブジェクトがヒープ上にある可能性があります (インスタンス変数が参照を保持しているとします)。

于 2012-04-26T17:55:15.067 に答える
13

答えは、この 2 つは異なる範囲にあるということです。その変数は、内部クラスがアクセスする前に変更される可能性があります。それを最終的にすることはそれを防ぎます。

于 2012-04-26T17:53:45.120 に答える
8

これは、関数内の内部クラスが実際にローカル変数のコピーを作成するためです。これは、ローカル クラスのインスタンスがまだ存在している間に、関数呼び出し後にローカル変数が破棄される可能性があるためです。ローカル変数の 2 つのコピーが常に同じ値を持つようにするには (同一に見えるようにするため)、変数を final として宣言する必要があります。

于 2013-07-10T20:48:00.850 に答える
3

これは、プログラマーがミスをするのを防ぐためだと思います。このようにして、コンパイラーは、そのメソッドを終了すると変数にアクセスできなくなることをプログラマーに通知します。これはループで重要です。このコードを想像してみてください。

public void doStuff()
{
    InnerClass cls[] = new InnerClass[100];
    for (int i = 0; i < 100; ++i)
    {
        cls[i] = new InnerClass()
        {
            void doIt()
            {
                System.out.println(i);
            }
        };
    }
}

doIt()メソッドが呼び出されると、何が出力されますか?iループ中に変更されました。この混乱を防ぐには、変数をローカル変数にコピーするか、変数finalを作成する必要がありますが、そうするとループできなくなります。

于 2012-04-26T17:52:13.750 に答える
1

内部クラスは最終的なものであるため、最終エンティティ内から何も変更できないはずです。

于 2012-04-26T17:53:47.717 に答える