「内部(インナー)クラス」の紹介と、外部からの使い方の解説を行います。
クラスの直下に、非staticのクラスを作ると、それは「内部クラス」になります。この時、外側のクラスを「外部クラス」と呼びます。
ネストしたクラスとの大きな違いはstaticではないことです。
こういった内部クラスを持つクラスのことを「エンクロージング型のクラス」と呼びます。エンクロージングとは、囲い込みという意味です。
┏外部クラス━━━━┓ ┃ ┃ ┃┏内部クラス━━┓┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┃ ┃ ┃ ┗━━━━━━━━━┛
内部クラスと外部クラスは「紐付け」られます。
内部クラスのオブジェクトは、外部クラスのオブジェクトにぶら下がっています。そして、内部クラスのオブジェクトから、外部クラスのインスタンスにアクセスが可能になっています。
外部クラスへのアクセスは「外部クラス名.this.フィールド名」として行います。
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 内部クラスの型( )」とすることで、内部クラスのオブジェクトは作成されます。
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」と出力
}
}
この内部クラスのオブジェクトは複数作ることができます。その際は、それぞれの内部クラスのオブジェクトから、外部クラスのオブジェクトにアクセスすることができます。
┏━━━━━━┓ ┌────アクセス可能──┨内部クラスの┃ │┌───紐付いている──┨オブジェクト┃ ↓↓ ┗━━━━━━┛ ┏━━━━━━━┓ ┏━━━━━━┓ ┃外側のクラスの┃←─アクセス可能──┨内部クラスの┃ ┃オブジェクト ┃←─紐付いている──┨オブジェクト┃ ┗━━━━━━━┛ ┗━━━━━━┛ ↑↑ ┏━━━━━━┓ │└───アクセス可能──┨内部クラスの┃ └────紐付いている──┨オブジェクト┃ ┗━━━━━━┛