• ベストアンサー

無名インナークラスからアクセスされるローカル変数の扱いについて

はじめまして。Javaの初心者です。質問があります。 ローカル変数が無名インナークラスからアクセスされるときは、 ローカル変数にfinalをつけないと、コンパイルエラーになります。 なぜなのでしょうか?どうかご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • bnosuke-x
  • ベストアンサー率39% (43/110)
回答No.1

一見理不尽な気もしますが、それが仕様です。 理由は、無名クラスと外部クラスは、あくまで別のクラスだからです。 別のクラスのメンバ変数にアクセスする手段はあっても、ローカル変数に直接アクセスする手段はありませんよね。 ですから、ローカル変数にアクセスできない方が正常なのです。 ですが、特例としてローカル変数にfinalをつければアクセスできます。 これには少しカラクリがあって、実際には変数にアクセスしているのではなく、変数の値をコピーして無名クラスのコンストラクタに見えない引数として渡しているのです。 ですから、無名クラスにfinalでない変数の値を渡したい場合は、ローカル内部クラスに書き換えて、コンストラクタで値を渡すようにするなどした方がよいでしょう。

penpenpen000
質問者

お礼

bnosuke-x様へ ご回答ありがとうございました。 無名クラスがローカル変数にアクセスしているのではなくて、 ローカル変数のコピーが無名クラスに渡されて、クラス内で それを使用しているのですね。 勉強になりました。ありがとうございました。

関連するQ&A