なんとなく使っていたインナークラスをきちんと知る。
インナークラスとは
クラス宣言ブロックの中にさらにクラス宣言を書くこと。
外側クラスのメンバや変数に対して特別アクセスできる。
インナークラスの種類
種類 | 宣言場所 | 特徴 |
---|---|---|
メンバクラス | クラスブロックの中 | staticと非staticに分かれる |
ローカルクラス | メソッドブロックの中 | メソッド内で複数回使うようなクラスを作る |
匿名クラス | 分の中 | 一度しか使わないクラスを作る |
メンバクラス
クラス内にメンバとして作成するクラス。
staticつきメンバクラス
言語仕様上はインナークラスではない。
外側クラスのstaticな変数にのみアクセスできる。
外側のクラスとインナークラスの結びつきは薄く、別のクラスとして宣言してもいいレベル。
使用例
//外側クラスから利用する場合 Inner i = new Inner(); //無関係なクラスから利用する場合 Outer.Inner i = new Outer.Inner();
非staticメンバクラス
外側クラスのインスタンスがないとnewできない。
結びついている外側インスタンスの非staticメンバにもアクセスできる。
外側クラスとセットになっているイメージ。
使用例
//インスタンスの生成方法 Outer o = new Outer(); Outer.Inner. oi = o.new Inner();
ローカルクラス
メソッドブロック内で宣言されるクラス。そのメソッド内でだけ使用できる。
外側クラスのメンバにアクセス可能。
同メソッド内の変数にはfinal付きのもののみアクセス可能。
使用例
public class Outer { int outerMember; void outerMethod() { int a = 10; class Inner { public void innerMethod() { System.out.println(outerMember); //System.out.println(a); 変数aは利用できない } } Inner ic = new Inner(); ic.innerMethod(); : 以下略
匿名クラス(無名クラス)
メソッド内で独自のクラスを定義してそのインスタンスを使いたい、ただし1回しかインスタンス生成は行わない。
宣言と利用を同時に行うため、記述方法が通常と異なる。
実装例
public class Main { public static void main(String[] args){ Test<Object> test = new Test<Object>(); test.put(new Object() { //Objectは匿名クラスの親クラスとして指定。 String innerField(); void innerMethod() { ... } }); } }
「new Object()」の部分はクラスでなくインタフェースでも可能。