トップ 一覧 置換 検索 ヘルプ RSS ログイン

Javaの内部クラスの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
ローカルな内部クラスのインスタンスのライフタイム(生成されてからGCされるまでの期間)は、
それを宣言するブロックやメソッドのライフタイムより長いことがあり、
その場合、内部クラスから参照しているローカル変数や引数が実際に参照を行なう
タイミングまで存在し続けていないことがあります。
そういったケースでも正しく値が参照できることを保証するため、
参照可能なものを内部クラスが生成される時点以降に値が変更されないもの、
すなわち、final宣言されているローカル変数や引数のみに制限し、
その値をコピーしてインスタンス内部に保持するようになっています。
http://javafaq.jp/S016.html

!!!大まかに
 class TopLevelClass {                       // トップレベル型
    static class StaticMemberClass {}       // staticなメンバー型
 
    class NonStaticMemberClass {}           // 非staticなメンバー型
 
    static {
	class StaticInitializerLocalClass {}    // ローカルクラス
    }
 
    {
	class InstanceInitializerLocalClass {}  // ローカルクラス
    }
 
    static void staticMethod() {
	class StaticMethodLocalClass {}         // ローカルクラス
 
	Runnable staticAnonymousClassInstance =
	    new Runnable() {                    // 匿名クラス
		public void run() {}
	    };
    }
 
    void method() {
	class MethodLocalClass {}               // ローカルクラス
 
	Runnable anonymousClassInstance =
	    new Runnable() {                    // 匿名クラス
		public void run() {}
	    };
    }
 }

これらの型の分類を示したのが以下の図です。

 [型](注1)

  ├[トップレベル型]

  └[ネストした型]

        ├[メンバ型]
        │    │
        │    ├[staticなもの]
        │    │
        │    └[staticでないもの]

        ├[ローカルクラス]

        └[匿名クラス]


!!!内部クラスから外側のクラスのメソッドや変数を明示的に参照するにはどうすれば良いのですか?

[S016 A-10]
それぞれ、「クラス名.this.メソッド名」、「クラス名.this.変数名」とします。


!!!ネストした型を他のクラスから new するにはどうすれば良いのですか?
[S016 A-11]
staticなメンバ型の場合はnew Outer.Inner()のように、
それ以外の場合(内部クラスの場合)はそれを囲うクラスのインスタンスを用いて
outer.new Inner()のようにします。

{{category2 プログラミング言語,Java}}