- ベストアンサー
ローカルインナークラスについての質問
- ローカルインナークラスとは、メソッド内で宣言されるクラスです。
- インナークラスはfinalで宣言されたローカル変数しか使えない。
- ローカルクラスは外部クラスのメンバ変数への参照更新が可能である。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
どちらかというと、問題が間違っているということになるでしょうか。ちょっと誤解しやすい表現になっていますね。確かに、「ローカルクラスは外部クラスのメンバ変数への参照更新は可能」なんですが、問題のいいたいことはそこじゃなくて…… こういうことです。 class Outer{ void func(){ final int x = 0; // メソッド内のfinalローカル変数 int y = 0; // メソッド内の普通のローカル変数 class Inner{ int getX(){ return x; // xはfinalローカル変数だからOK } int getY() { return y; // yはfinalじゃないローカル変数だからNG } } } } ローカル変数はメソッドがreturnするとなくなってしまいますが、メソッド内で作られたInnerのインスタンスはメソッドがreturnしてもなくなるとは限りません。(メソッドの戻り値として返された場合など) そうなった場合、すでになくなっているローカル変数の値をInnerから参照してしまう可能性があります。 そこで、ローカル変数の値をメソッドがreturnした後まで別のところに取っておく必要がありますが、finalじゃないローカル変数はメソッド内で何回も代入できるので、いつ代入された値をとっておけばよいのかわからなくなってしまいます。そこで、変数をfinalにして1回しか代入できないようにして、混乱を防いでいるのです。 もちろん、finalローカル変数はちゃんと代入しておかなくてはいけません。また、メソッドの引数やキャッチされる例外も同様の扱いを受けます。 なんだかちょっとややこしいですが、とにかく「インナークラスからアクセスされるローカル変数はfinal」です。
お礼
本当にいつもお世話になりっぱなしです。 やはり問題に言葉が足りませんよね。 この場合yにアクセスできないというのはわかります。 勉強したばかりでした。 しかし外部のcount(私の書いた例)にはアクセスできる、 そのことをやっと理解したばかりなのに、 この別の本の例題で、 「finalだけ」 と無情に・・・(^_^;) >「インナークラスからアクセスされるローカル変数はfinal」 もしかしてそういうことかな?とも思ったのですが、 「だけ」と断言されてしまうと、 countにアクセスできるのも何かの間違え・・・?? とも思えてきてしまい、真相を知りたくて質問させていただきました。 秀和システムのテキストはとても丁寧なのですが、 翔泳○のテキストはおかしな記述が多いです。 とても助かりました。 ほっといたしました。
補足
ローカル変数にアクセスさせたい場合には、 finalとする、ということですよね?