インナークラス
以下の3種類に大別できる
-
ネステッドクラス
クラス定義にネストして定義するクラス -
ローカルクラス
ローカル変数と同じ場所に定義するクラス(メソッドの中に定義)。 -
無名クラス
ネステッドクラス
ネストクラスが外側のクラスの参照を持つか持たないかで2つに大別される。
-
スタティックネステッドクラス
参照を持たない。したがって、意味的につながりがある場合に使用する。 -
非スタティックネステッドクラス
参照を持つ。したがって、データ的につながりがある場合に使用する。
基本的に、外側からも、内側からも各クラスのフィールドおよびメソッドにはアクセスすることが出来る。
注意
基本的に推奨されない。特に非スタティックネステッドクラスは、
よく知らない第三者が、コードをメンテナンスするときに
インスタンスの内容を~間違って変更する可能性が高く、使用を避けるべき。
スタティックネステッドクラス
-
定義
public class InnerClassTest {private static String str = "Outer"; private String str2 = "instancd Outer"; public InnerClassTest() { new Inner().method(); } public static class Inner { private String str = "Inner"; public void method() { System.out.println(InnerClassTest.str); // staticなフィールド、メソッドに限り、アクセス可能 System.out.println(InnerClassTest.this.str2); // これは不可能 } } public static void main(String[] args) { new InnerClassTest(); } }
-
インスタンスの生成方法
public, protectedであれば、定義クラス外からでもインスタンスを生成できる。InnerClassTest.Inner inner = new InnerClassTest.Inner();
非スタティックネステッドクラス
-
定義
public class InnerClassTest2 {private static String str = "Outer"; private String str2 = "instance Outer"; public InnerClassTest2() { new Inner().method(); } public class Inner { private String str = "Inner"; public void method() { System.out.println(InnerClassTest2.str); // staticなフィールド、メソッドの参照OK System.out.println(InnerClassTest2.this.str2); // インスタンスのフィールド、メソッドも参照化 } } public static void main(String[] args) { new InnerClassTest2(); } }
-
インスタンスの生成方法
// コンパイルエラーInnerClassTest2.Inner inner = new InnerClassTest.Inner(); // 下記の方法でインスタンスかできるが推奨されない InnerClassTest2 outer = new InnerClassTest2() InnerClassTest2.Inner inner = outer.new InnerClassTest2.Inner();