マンガで分かる Java入門講座

第10章 クラスとオブジェクト3
10-7. 内部クラス

「内部(インナー)クラス」の紹介と、外部からの使い方の解説を行います。

● 内部クラスと外部クラス

 クラスの直下に、非staticのクラスを作ると、それは「内部クラス」になります。この時、外側のクラスを「外部クラス」と呼びます。

 ネストしたクラスとの大きな違いはstaticではないことです。

 こういった内部クラスを持つクラスのことを「エンクロージング型のクラス」と呼びます。エンクロージングとは、囲い込みという意味です。

図)エンクロージング型のクラス
┏外部クラス━━━━┓
┃         ┃
┃┏内部クラス━━┓┃
┃┃       ┃┃
┃┗━━━━━━━┛┃
┃         ┃
┗━━━━━━━━━┛

● 内部クラスと外部クラスの紐付け

 内部クラスと外部クラスは「紐付け」られます。

 内部クラスのオブジェクトは、外部クラスのオブジェクトにぶら下がっています。そして、内部クラスのオブジェクトから、外部クラスのインスタンスにアクセスが可能になっています。

 外部クラスへのアクセスは「外部クラス名.this.フィールド名」として行います。

ソースコード)内部クラスと外部クラスの紐付け src/sample/MyClass.java
package sample;

public class MyClass {
    private int n = 0;

    // 「内部クラス(インナークラス)」
    // 外部クラスのインスタンスに紐付く
    public class Innr {
        private int n = 9;

        // 自身のクラスの値を得る
        public int getThisN() {
            return this.n;  // 自クラスのn
        }

        // 内部クラスから外部クラスの値を得る
        public int getMyClassN() {
            return MyClass.this.n;  // 外側のクラスのn
        }
    }
}

 この紐付けは、内部クラスの初期化の際に行われます。「外部クラスのオブジェクト.new 内部クラスの型( )」とすることで、内部クラスのオブジェクトは作成されます。

ソースコード)内部クラスのオブジェクトの作成 src/sample/Sample.java
package sample;

public class Sample {
    public static void main(String[] args) {
        MyClass mc = new MyClass();

        // 内部クラスを外部から作成
        MyClass.Innr pub = mc.new Innr();

        // 内部クラスから内部クラスの値を得る
        System.out.println(pub.getThisN());  // 「9」と出力

        // 内部クラスから外部クラスの値を得る
        System.out.println(pub.getMyClassNo());  // 「0」と出力
    }
}

● 内部クラスのオブジェクトを複数作る

 この内部クラスのオブジェクトは複数作ることができます。その際は、それぞれの内部クラスのオブジェクトから、外部クラスのオブジェクトにアクセスすることができます。

図)複数の内部クラスのオブジェクトが作成可能
                   ┏━━━━━━┓
      ┌────アクセス可能──┨内部クラスの┃
      │┌───紐付いている──┨オブジェクト┃
      ↓↓           ┗━━━━━━┛
┏━━━━━━━┓          ┏━━━━━━┓
┃外側のクラスの┃←─アクセス可能──┨内部クラスの┃
┃オブジェクト ┃←─紐付いている──┨オブジェクト┃
┗━━━━━━━┛          ┗━━━━━━┛
      ↑↑           ┏━━━━━━┓
      │└───アクセス可能──┨内部クラスの┃
      └────紐付いている──┨オブジェクト┃
                   ┗━━━━━━┛

この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/06/06  更新:2015/08/09  [Permalink]