頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Java】入れ子クラス(NestedClass)及びInnerClassの書き方

入れ子クラス(NestedClass)とは

あるブロック内で宣言されたクラスの総称を入れ子クラス(NestedClass)と云う。
入れ子クラス(NestedClass)には以下の種類がある。

クラス 説明
staticメンバークラス クラス内で宣言されるstaticなクラス
メンバークラス クラス内で宣言されるインスタンスクラス
ローカルクラス メソッド内で宣言されるクラス

また、上記の内、下2つを内部クラス(InnerClass)と云う。
これらのクラスはクラス名を持たずに利用することができ、このようなクラスを匿名クラスという。

public class Outer {
    private static class staticClass {}      //staticメンバークラス
    private class instanceClass {}            //メンバークラス(内部クラス)

    void methodA(){
      class localClass{}                   //ローカルクラス(内部クラス)
    }
}

メンバークラスとして宣言された入れ子クラスは通常のフィールドやメソッドのようにアクセス修飾子を付けることができる。
(ローカルクラスにアクセス修飾子を付けるとコンパイルエラーになる。)

内部クラス(メンバークラスの)メソッドを呼び出す

内部クラスのインスタンスを生成し、メソッドへアクセスする。

public class oya {

    public void callInner(){
        Inner i = new Inner();
        i.print();
    }

    public class Inner{
        public void print(){
            System.out.println("this code is a InnerClass");
        }
    }
}

呼び出し側

public class Main {

    public static void main(String[] args) {
        oya o = new oya();
        o.callInner();  //"this code is a InnerClass"
    }
}

staticメソッドが内部クラスを呼び出す方法

staticメソッドから内部クラスを利用するには、最初に外側のクラスのインスタンスを生成し、その参照を用いて内部クラスのインスタンスを生成してアクセスする。

public class oya {

    public static void callInnerByStatic(){
         new oya().new Inner().print();
    }
    public class Inner{
        public void print(){
            System.out.println("this code is a InnerClass");
        }
    }
}

呼び出し側

public class Main {

    public static void main(String[] args) {
        oya.callInnerByStatic();  //"this code is a InnerClass"
    }
}