Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ローカルクラスについて

参考書にローカルクラスは外部クラスのメソッドのローカル変数について「final修飾されたもの」のみアクセスできる。それ以外にアクセスするとコンパイルエラーとなる。と記載されており、このサイトにも同様の記述があるのですが、下記の通りソースコードを実行すると問題なく実行できてしまい混乱しております。ネットで探してみましたが見つかりませんでしたので質問させていただきます。

サンプルコード

class Outer{
    private int b = 2;
    void methodOuter(final int c, int d){
        final int e = 5;
        int f = 6;
        class A{
            void methodA(){
                System.out.println(b);
                System.out.println(c);
                System.out.println(d);
                System.out.println(e);
                System.out.println(f);
            }
        }
        new A().methodA();
    }
}

public class Test{
    public static void main(String[] args){
        Outer o = new Outer();
        o.methodOuter(3,4);
    }
}

実行結果
2
3
4
5
6

上記説明を素直に解釈するとローカルクラス内のメソッドで変数dと変数fにはアクセスできない(コンパイルエラーになる)と思うのですが、なぜ実行できてしまうのでしょうか。エクリプスとコマンドプロンプト両方で同じ結果がえられました。

2

回答

93888

閲覧

2件の回答

評価

10

お使いの環境はJava8のはずです。
Java7ではおっしゃるとおりコンパイルエラーになりま
す。

これは言語仕様がJava7までの[必ずfinalとしなければ
ならない」からJava8で「もしその変数が実質的に変更
されることがないならfinalと同様とみなす」みたいな
感じに変わったのだそうです。

こういうふうになったのはJava8の新仕様のlambdaが使
いやすくなるようにとの配慮だったかな。

例えば下記のページに書いてありました。

www.ne.jp/asahi/hishidama/home/tech/java/lambda.ht
ml

評価

0

回答ありがとうございます。
確かに私のjavaのversionは1.8で、説明は1.7のversionな
のですね。すっきりしました。どうもありがとうございま
した。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。