内部クラス

Javaでは、メソッドと同様に、クラスの変数もメンバーとして別のクラスを持つことができます。
別のクラス内にクラスを書くことは、Javaでは可能です。
内部に記述されたクラスはネストされたクラスと呼ばれ、内部クラス(inner Class)を保持するクラスは外部クラス(outer Class)と呼ばれます。

内部クラスは、外部クラスとの紐づきが強く、外部クラス内部での利用に留まる場合に利用されるケースが多いです。

内部クラスの構文

内部クラス
public class Hoge {

//Hogeのメンバーフィールド,メソッドを定義

class 内部クラス名 {

//内部クラスのメンバーフィールド,メソッドを定義

}

}
InnerClassSample.java
package jp.co.yourcompany.education.samples;

/**
 * 内部クラスのサンプル
 * @author raita.kuawabara
 */
public class InnerClassSample {

    private int outerCounter = 0;

    /**
     *  outerCounterのインクリメント
     */
    public void outerIncrement(){
        outerCounter++;
    }

    /**
     * outerCounterを取得する
     * @return outerCounter;
     */
    public int getOuterCounter(){
        return outerCounter;
    }

    /**
     * インナークラス
     */
    class InnerClass {
        private int innerCounter = 0;

        /**
         * インナークラスからouterクラスのインクリメント
         */
        public void outerIncrementByInner(){
            outerCounter++;
        }
        /**
         *  innerCounterのインクリメント
         */
        public void innerIncrement(){
            innerCounter++;
        }
        /**
         *  innerCounterを取得する
         *  @return innerCounter
         */
        public int getInnerCounter(){
            return innerCounter;
        }
    }

    /**
     * javaコマンドから実行するクラス
     */
    public static void main( String[] args ){
        //sample
        InnerClassSample sample = new InnerClassSample();
        InnerClass inner = sample.new InnerClass();

        System.out.println("outerCounter:" + sample.getOuterCounter() );
        sample.outerIncrement();
        System.out.println("sample.outerIncrement();" );
        System.out.println("outerCounter:" + sample.getOuterCounter() );
        inner.outerIncrementByInner();
        System.out.println("inner.outerIncrementByInner();" );
        System.out.println("outerCounter:" + sample.getOuterCounter() );

        System.out.println("innerCounter:" + inner.getInnerCounter() );
        inner.innerIncrement();
        System.out.println("inner.innerIncrement" );
        System.out.println("innerCounter:" + inner.getInnerCounter() );
    }
}
				
出力結果
outerCounter:0
sample.outerIncrement();
outerCounter:1
inner.outerIncrementByInner();
outerCounter:2
innerCounter:0
inner.innerIncrement
innerCounter:1
					

内部クラスはサンプルクラスを見てわかるように外部クラスとの紐づけなしではクラスとして実行できません。

外部クラス.new インナークラスと外部クラスのインスタンスの内部クラスして利用します。

deploy/classes以下に生成されたクラスファイルをご覧ください。内部クラスが他のクラスの生成のされ方(名称)が異なることが分かります。

内部クラスは、即席でアウタークラスからクラスを利用するには大変優れていますが、
内部クラスの構文を利用しなくても同一パッケージ内部で別クラスを定義することでも同じ事が表現できます。
内部クラスを利用する際には、その必要性を考慮した上で実装して下さい。

サンプルのダウンロードと実行方法

  • java_sample14.zipファイルを「c:¥download¥java¥samples¥」に保存して下さい。
  • java_sample14.zipファイルを「c:¥projects」配下に展開して下さい。
  • コマンドプロンプトを起動して、「sample14.bat」を実行して下さい。
  • javac,jar,javaが実行されてInnerClassSampleが実行されます。
  • Linux,Unix,iOSの方はバッチファイルはお手数ですが作成して下さい。改行コードが「CRLF」の点ご留意ください。