2011-08-16 4 views
23

私は現在Sierra & Batesの本でS(O)CJPを準備中です。匿名の内部クラスでfinalキーワードを使用するのはなぜですか?

内部クラス(ローカルまたは匿名メソッド)については、クラスがヒープ上に存在し、メソッドによって返された後にスタック上にあるため、ローカル変数にアクセスできないと言いますスタック上のこれらの変数へのアクセスは終了しましたが、メソッドが終了して以来もう存在しません...

最終的なキーワードを使用してこれを回避することができます。これは、彼らが本で言うことですが、彼らは実際にその最終的なキーワードの効果は何かを説明していない... 私の知る限り、メソッドのローカル変数の最後のキーワードを使用して、 ...だから、スタックはスタックがなくなっても最終的な変数にアクセスすることはできますか?

私は、この最終的なローカル変数のある種の「コピー」が内部クラス内にあるはずだと思います。値が変わることはできないので、この情報を複製しないのはどうでしょう... 誰かがこれを確認するか、私に何か不足していると教えてもらえますか?

答えて

18

あなたの直感は、変数が最終的なので、そのコピーを作成するのが正しいためです。もちろん参照型の場合、参照をオブジェクトにコピーし、参照先のオブジェクトはコピーしないことを意味します。

11

コンパイラは、内部クラスが外部クラスの最終フィールドに到達するように、カバーの下にある最終参照を微妙にトリッキーにコピーします。コピーは、値が変更されないようにフィールドが最終的でなければならない理由です。

http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/

+0

はい、コンパイラは最終変数でなくても変数をコピーできます。私の推測では、最終的なものにすることが必要なのは、コードが変更されないことをより明確にしているからです。 –

+2

問題は私の理解では、最終的なものである必要がなければ、外部変数が変わるたびにこれを扱い、更新することをはるかに注意深く追跡する必要があるということです。内部クラスのインスタンスが多数あり、それらをすべて更新する必要がある場合はどうなりますか? –

関連する問題