【Java】インナークラスとは?

Java

Javaにはクラス内に作成するクラスというものがあります。

これをインナークラスと言います。

Javaを勉強し始めた当初にクラス内に定義するのはメソッドということを学んだかと思います。

そのためクラス内にクラスを作成するというのは何とも不思議な感じがするのではないでしょうか?

私も初めて学んだ際は戸惑い、理解するのに少し時間を要しました。

そんなインナークラスについて「どういった使用方法なのか?」「使用することでどういったメリットがあるのか?」といったことを解説していきます。

インナークラスとは?

では早速インナークラスの使用方法について解説していきます。

【インナークラスの例】
public class Outer1 {
	public static void main(String [] args) {
		new Outer1().new Inner1().inner();
	}
	private class Inner1{
		public void inner() {
			System.out.println("インナークラスのメソッドです");
		}
	}
}
【実行結果】
インナークラスのメソッドです

上記がインナークラスの使用例です。

Outer1クラス内にInner1というクラスが作成されていることが分かるかと思います。

そしてインナークラスを使用する場合同じクラス内のメソッドでもまず外側のクラス(以降エンクロージングクラスと言います)であるOuter1をインスタンス化して、その後インナークラスであるInner1をインスタンス化しています。

これによりインナークラス内のメソッドへのアクセスが可能となります。

ではこのようなインナークラスにどのようなメリットがあるかというと情報隠蔽の強化を行えるというものです。

情報隠蔽とはそのメソッドやフィールド等にどのような機能があるのかを公開する範囲を最小限にすることを言います。

どういうことかと言いますと、先ほど作成したInner1クラスに下記のようなコードでアクセスしようとします。

【コード例】
public class Outer2 {

	public static void main(String[] args) {
		new Outer1().new Inner1().inner();
	}

}

しかしこのコードはコンパイルエラーとなります。

その理由としてInner1はprivateで修飾されているため、他のクラスからはアクセスできないようになっています。

これによりInner1がどのようなクラスかということが外部の他のクラスからは分からないようになっています。

これにより情報隠蔽が強化されるので、想定外の使用などを予防することができます。

staticインナークラスとは?

ここまでインナークラスについて話してきましたが、もう一つクラス内にクラスを作成する方法が存在します。

それがstaticインナークラスというものです。

【staticインナークラスの例】
public class StaticOuter {

	public static void main(String[] args) {
		new STInner().inner();
	}
	static class STInner{
		public void inner() {
			System.out.println("staticインナークラスのメソッドです");
		}
	}

}
【実行結果】
staticインナークラスのメソッドです

上記がstaticインナークラスの使用例です。

通常のインナークラスと異なり、エンクロージングクラスをインスタンス化する必要がありません。

インナークラスのみインスタンス化するだけでいいので、通常のインナークラスよりも使い勝手がよくなったことが分かるかと思います。

ただこのstaticインナークラスで気を付けていただきたい事があります。

それがstaticインナークラスから非staticなフィールドやメソッドへアクセスはできないというものです。

先ほどのコードを下記のように書き換えました。

【非staticなフィールドへアクセスするコード】
public class StaticOuter {
	String a="staticインナークラスからはアクセスできません";
	public static void main(String[] args) {
		new STInner().inner();
	}
	static class STInner{
		public void inner() {
			System.out.println("staticインナークラスのメソッドです");
			System.out.println(a);
		}
	}

}

上記コードは変数aを出力しようとしたところでコンパイルエラーが発生します。

これはSTInnerクラスがstaticであるが、変数aが非staticであるためです。

仮に変数aを下記のように変更するとコンパイルエラーは発生しなくなります。

static String a="staticインナークラスからはアクセスできません";

この点には気を付けてください。

まとめ

この記事ではJavaのインナークラス・staticインナークラスについて解説してきました。

  • インナークラスとは?
  • staticインナークラスとは?

インナークラスはクラス内にクラスを作成することで情報隠蔽の強化を実施することができます。

エンクロージングクラスをまずインスタンス化して、その後にインナークラスをインスタンス化するという少し面倒な手順を踏みますが、staticインナークラスの方は通常のインスタンス化と変わらない方法で使用可能です。

ただしstaticインナークラスから非staticなフィールドやメソッドへのアクセスはできませんのでその点は気を付けてください。

以上で今回の解説は終了となります。

コメント

タイトルとURLをコピーしました