第16章 内部クラス (Java)
内部クラス
- 内部クラスは、フィールドやメソッドと同じ外部クラスの新しいメンバとして定義する。
(コンストラクタの引数を指定する必要がない) - 同じクラスのメンバなので、外部クラスのすべてのフィールドやメソッドにアクセスできる。
privateフィールドにもアクセス可能 - 内部クラスは、単独ではオブジェクトを作成できない。
- 他のクラス内で内部クラスのオブジェクトをインスタンス化することは可能
ただし、外部クラスのオブジェクトを作成してからでなければ内部クラスのオブジェクトは作成できない。
(例)- Outer out=new Outer();
OUter.Inner in=out.new Inner();
又は - Outer.Inner in =new Outer().new Inner();
と書けるだけで、実際に使うケースは多くはない。
- Outer out=new Outer();
ネストクラス
- 外部クラスの中に定義したクラスをネストクラスという。
- 内部クラス(非静的ネストクラス)
- 外部クラスのオブジェクトが存在しなければ作成できない。外部クラスに従属するので特に内部クラスという。
- 静的ネストクラス
- staticの付くネストクラスは、外部クラスのメンバであるが、静的ネストクラスといい、外部クラスのオブジェクトから独立している。
- 従属関係のある内部クラスではなく単にクラスの中に定義したクラスという位置づけ。
- 外部クラスのオブジェクトを作成してもその中に静的ネストクラスは、取り込まれない。
- 外部クラスのstaticでないメンバにはアクセスできない。
- 静的ネストクラスのクラス宣言にあるstaticは、ネストクラスであることを表すだけでstaticなメソッドや変数のようにクラスをインスタンス化しなくても最初から存在すると言う意味ではない。
- 独立してインスタンス化できることを示すだけであるから、new演算子を使ってオブジェクトを作成する必要がある。
(例)
Outer.Nest nest = new Outer.Nest();