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(1回しか代入できない)ではないローカル変数はメソッド内で何回も代入できるので、いつ代入された値をとっておけばよいのかわからなくなってしまいます。 そこで、変数をfinalにして1回しか代入できないようにして、混乱を防いでいるのです。 もちろん、finalローカル変数はちゃんと代入しておかなくてはいけません。 また、メソッドの引数やキャッチされる例外も同様の扱いを受けます。 「インナークラスからアクセスされるローカル変数はfinal」です。