内部クラスとは?
状態:-
閲覧数:2,640
投稿日:2013-04-23
更新日:2013-05-08
・クラス内に宣言されたクラスのこと
※「インナークラス」とも呼ばれる
・staticキーワードはつけない
※static を付与して宣言されたクラスは全て 、「内部クラス」ではなく「static なメンバクラス」となる
・厳密に定義すると「外部クラス内で定義されたクラス」となるが、外部クラスという特別なクラスが存在するわけではなく、「普通のクラス内」にクラスを作成すると、結果として「外側にあるクラス」が「外部クラス」と呼ばれるようになる
使い所
・あるクラスのメンバ変数やメソッドに強く依存しているクラスは、そのクラスの内部クラスとして宣言する
※内部クラスはクラス間の関係を明確にするために使用
宣言(定義)できる場所
・外部クラス内
・外部クラスのメンバ(プロパティ or メソッド)内
※「インナークラス」とも呼ばれる
・staticキーワードはつけない
※static を付与して宣言されたクラスは全て 、「内部クラス」ではなく「static なメンバクラス」となる
外部クラス(outer class)で宣言とは?
・厳密に定義すると「外部クラス内で定義されたクラス」となるが、外部クラスという特別なクラスが存在するわけではなく、「普通のクラス内」にクラスを作成すると、結果として「外側にあるクラス」が「外部クラス」と呼ばれるようになる
使い所
・あるクラスのメンバ変数やメソッドに強く依存しているクラスは、そのクラスの内部クラスとして宣言する
※内部クラスはクラス間の関係を明確にするために使用
宣言(定義)できる場所
・外部クラス内
・外部クラスのメンバ(プロパティ or メソッド)内
「内部クラス」に分類されるクラス
ローカルクラス
・内部クラスの内、メソッドに宣言(定義)したクラスを、「ローカルクラス」と呼ぶ
・「ローカル内部クラス」と呼ばれることもある
匿名クラス
・内部クラスの内、クラス名がないクラスを「匿名クラス」と呼ぶ
・「無名クラス」と呼ばれることもある
※「ローカルクラス」「匿名クラス」は、「内部クラス」に分類される
「内部クラス」は2種類?
・「内部クラス」は2通りの使われ方をすることがある
※ネットで「内部クラス」について調べると、サイトによって「内部クラス」の定義が違う(ことがある)理由
特徴
内部クラスのインスタンス
内部クラスのインスタンスは、外部クラスのインスタンス内にある
1.外部クラスのインスタンス作成
2.そのインスタンス参照経由で内部クラスのインスタンスを作成(外部クラスのインスタンス1つに対して複数の内部クラスのインスタンスが生成可能)
3.外部クラスのインスタンスと結びついた内部クラスのインスタンスが作成される
4.内部クラスは外部クラスのフィールド及びメソッドにアクセスできる
解説
・内部クラスのインスタンスは、外部クラスのインスタンスの中に含まれる
・そのため、内部クラスのインスタンスを生成するためには、必ず外部クラスのインスタンスが必要となる
・その「外部クラスのインスタンス」を「エンクロージングインスタンス」と呼ぶ
※但し「このケース」=「エンクロージングインスタンス」ではなく、あくまでも「エンクロージングインスタンス」の「1ケース」に過ぎない。詳しくはこちら
単純なnewInstanceでは、newされない
内部クラスのインスタンス化は、エンクロージングインスタンスの存在が前提
・外部クラスのインスタンスがないと、内部クラスのインスタンスは生成不可
コード例
前提
・class B … 「ネストクラス」「内部クラス」
public class A {
public class B {
}
}
インスタンス生成
1.外部クラスのインスタンス生成
A a = new A();
2.そのインスタンス参照(生成したインスタンスオブジェクト)経由で、内部クラスのインスタンスを生成
B b = a.new B();
→外部クラスのインスタンスと結びついた内部クラスのインスタンスが生成される
this
・生成箇所が、外部クラスのインスタンスメソッド内であれば、外部クラスのインスタンスとしてthisを利用可能
public class A {
public class B {
}
public void hoge() {
B b = this.new B();
}
}
thisは省略可能
・thisは省略可能なので以下のようなコードで書かれることが多い
public class A {
public class B {
}
public void hoge() {
B b = new B();
}
}
staticメソッドでは、this利用不可
・staticメソッド内で内部クラスをインスタンス化する際は、外部クラスのインスタンス生成してからnew
public class A {
public class B {}
public static void main(String[] args) {
A a = new A();
B b = a.new B();
}
}
内部クラスは、外部クラスのインスタンス1つにつき複数生成可能
A a = new A();
B b1 = a.new B();
B b2 = a.new B();
B b3 = a.new B();