クラスの直下に、非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」と出力 } }
この内部クラスのオブジェクトは複数作ることができます。その際は、それぞれの内部クラスのオブジェクトから、外部クラスのオブジェクトにアクセスすることができます。
┏━━━━━━┓ ┌────アクセス可能──┨内部クラスの┃ │┌───紐付いている──┨オブジェクト┃ ↓↓ ┗━━━━━━┛ ┏━━━━━━━┓ ┏━━━━━━┓ ┃外側のクラスの┃←─アクセス可能──┨内部クラスの┃ ┃オブジェクト ┃←─紐付いている──┨オブジェクト┃ ┗━━━━━━━┛ ┗━━━━━━┛ ↑↑ ┏━━━━━━┓ │└───アクセス可能──┨内部クラスの┃ └────紐付いている──┨オブジェクト┃ ┗━━━━━━┛