Categories: Java

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

入れ子クラス(NestedClass)とは

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

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

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

ClassA.java

public class ClassA{

   //staticメンバークラス
    private static class staticClass {}

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

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

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

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

インスタンスメソッドから内部クラスのメソッドを呼び出す

インスタンスメソッドから内部クラスのメソッドを呼び出すには、通常のクラスを利用するのと同じように、まず内部クラスのインスタンスを生成し、メソッドにアクセスします。
以下のコード例では、5行目で内部クラスのインスタンスを生成し、6行目でメソッドを実行しています。

ClassA.java

package test;
public class ClassA {
  //インスタンスメソッド
    public void callInner(){
        Inner i = new Inner();
        i.print();
    }

  //内部クラス
    public class Inner{
        public void print(){
            System.out.println("this code is a InnerClass");
        }
    }
}

このコードは、究極的には以下のように簡略化することができます。

ClassA.java

//インスタンスメソッド
public static void callInner(){
    new Inner().print();
}

staticメソッドから内部クラスのメソッドを呼び出す

staticメソッドから内部クラスのメソッドを呼び出すには、まず外側のクラスのインスタンスを取得してからその参照を用いて内部クラスのインスタンスを取得して、メソッドにアクセスします。
以下のコード例では、6行目で外側のクラスであるClassAのインスタンスを用いて内部クラスであるInnerのインスタンスを取得して、7行目でメソッドを実行しています。

ClassA.java

package test;

public class ClassA {
    //staticメソッド
    public static void callInner(){
        Inner i = new ClassA().new Inner();
        i.print();
    }

    //内部クラス
    public class Inner{
        public void print(){
            System.out.println("this code is a InnerClass");
        }
    }
}

このコードは、究極的には以下のように簡略化することができます。

ClassA.java

//staticメソッド
public static void callInner(){
    new ClassA().new Inner().print();
}

他クラスから、あるクラスの内部クラスを呼び出す方法

例えばClassB.javaからClassA.javaの内部クラスを利用するには以下のように記述します。

ClassA.java

package test;
public class ClassA {

  //内部クラス
    public class Inner{
        public void print(){
            System.out.println("this code is a InnerClass");
        }
    }
}

ClassB.java

package test;

public class ClassB {

    public static void main(String[] args) {
        new ClassA().new Inner().print();
    }
}

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

shiakisudev