Java の入れ子クラス

オブジェクト指向プログラミングを実現するために、言うまでもなくクラスの定義は非常に重要です。

基本的なクラスの定義方法については、「クラス定義とオブジェクト」で説明しましたが、 Java ではさらに柔軟にクラスを定義することができます。

ここでは入れ子クラス (nested classes) について説明します。

入れ子クラスとは?

入れ子クラス (nested classes) は、あるクラス定義の内部で、さらに定義されたクラスのことです。 クラス A の定義の中で、クラス B を定義したら、クラス B は入れ子クラスであり、かつ、クラス A のメンバーといえます。

入れ子クラスには何種類かあります。それをそれぞれ見ていきましょう。

Java の内部クラス

次のコードを見てください。

Car クラスの中に Door クラスが定義されています。このようなクラスを内部クラス (inner classes) といいます。(内部クラスは入れ子クラスです)

内部クラスではそれを含むクラスのメンバーへアクセスできます。

内部クラスを利用する場合は、次のようにそれを含むクラスで修飾します。次の例では Car.Door クラスとしてオブジェクトを定義しています。

また、オブジェクトを生成する場合には、外部クラスオブジェクト.new として作成するところに注意してください。(上の例では car.new は全て小文字です)

Java の静的入れ子クラス

入れ子クラスで static 修飾されている場合です。

この場合は、静的入れ子クラス (static nested classes) といいます。この場合はそれを含むクラス (この場合は Car クラス) の変数へアクセスできません。

静的入れ子クラスを使う場合は、それを含むクラスとの結合性が無い (内部メンバーにアクセスできない) ので、それぞれバラバラにオブジェクト生成できます。

new もオブジェクトに関連付けされていません。

Java のローカルクラス

内部クラス (static ではない、入れ子クラス) の特別な2形態として、さらにローカルクラス (local classes) と匿名クラス (anonymous classes) についても触れておきます。

ローカルクラスは次のようにメソッド内で定義されて使用されるクラスです。

ローカルクラスからはそれを含むクラスのメンバーにアクセス可能です。

Java の匿名クラス

匿名クラス (anonymous classes) は、インターフェイスから直ちにクラスを定義してインスタンスを作成する簡便な方法です。

例えば次のようなインターフェイスがあるとします。

これをローカル変数定義時に、クラスの内容 (ここでは run メソッドの中身) を定義しています。

直ちにオブジェクトが作成され、そのメソッドを呼び出すことが可能です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門