24

私は現在、Sierra & Bates の本で S(O)CJP を準備しています。

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

ご存知のように、final キーワードを使用してこれを回避できます。これは彼らが本で言っていることですが、その final キーワードの効果については実際には説明していません... 私の知る限り、メソッドのローカル変数で final キーワードを使用しても、ヒープ上で有効にはなりません。 ..では、スタックがなくなる可能性があるときに、クラスはスタック上にまだ存在する最終変数にどのようにアクセスできるのでしょうか???

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

4

2 に答える 2

19

変数は final であるため、コピーを作成しても安全です。もちろん、参照型の場合、これは、参照先のオブジェクトではなく、オブジェクトへの参照をコピーすることを意味します。

于 2011-08-16T10:32:38.073 に答える
12

コンパイラは、内部クラスが外部クラスの最終フィールドにアクセスできるようにするために、微妙なトリックを使用して最終参照を内部にコピーします。値が変更されないように、フィールドを final にする必要があるのはコピーのためです。

http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/を参照してください

于 2011-08-16T10:40:43.287 に答える