はじめに
Java Goldの「クラスとインターフェイス」という単元では、
クラス内に定義したクラスを差す「ネストしたクラス」についての問題が出題される。
試験で問われるネストしたクラスには下記の4つがある。
・インナークラス
・staticインナークラス
・ローカルクラス
・匿名クラス
学習していてこれらがどうもごっちゃになり紛らわしい。
そこで、このシリーズではキチンと整理して理解するために、これらについてまとめていく。
現在の自分のようにJava Goldの学習をされる方のお役に立てると嬉しい。
インナークラスとはクラスの中に定義したクラス
まずは、インナークラスの例をみていただきたい。
public class Outer {
class Inner {
// 何らかの処理
}
}
Outerクラスの中にInnerというクラスが存在する。
このInnerクラスのように、クラスの中に定義したクラスを 「インナークラス」 と呼ぶ。
このインナークラスに対して、「外側」にあたるOuterクラスは 「エンクロージングクラス」 と呼ばれる。
インナークラスはメンバとして定義するもの
インナークラスはエンクロージングクラスのメンバ として定義する。
メンバと聞くと、フィールドやメソッドがまず思い浮かぶが、
インナークラスはこれらのように取り扱われるクラスである。
したがって、アクセス修飾子を付けること ができるのだ。
なお、すべて のアクセス修飾子が使える。
【インナークラスを修飾できるアクセス修飾子】
- public
- protected
- private
- abstract
- final
- static
インスタンス化するには
インスタンス化するには、インナークラスを囲う エンクロージングクラスを先にインスタンス化せねばならない 。
前述の例でいえば、Outerクラスをnewした上で、Innerクラスをnewするのだ。
インナークラスのインスタンス化を行う場合、エンクロージングクラスの参照を用いて、
そのインスタンスへの参照とnew演算子を使ってこれを実施する。
インスタンス化の記述が通常のクラスのインスタンスとは異なっていて、
「外部クラスの型.内部クラスの型 内部クラスの変数 = 外部クラスの変数.new 内部クラスの型()」と記述することでインスタンス化される。
public class Main {
public static void main(String args){
Outer outerClass = new outer();
Outer.Inner innerClass = outerClass.new Inner();
}
}
これは 「インナークラスはメンバとして定義するもの」 という特徴と関連付けて覚えるといい。メンバとして定義されるフィールド変数やメソッドは、それを定義しているクラスがインスタンス化されていれば利用できない。
インナークラスもメンバとして定義されるものであるためにエンクロージングクラスのインスタンス化が前提となるのだ。
staticフィールドとstaticメソッド
staticインナークラスでない、ただのインナークラスにstaticなフィールド変数やstaticなメソッドを実装すると コンパイルエラー になるので注意。
次回はstaticインナークラスについてまとめる。