talosのプログラミング教室

Java Gold合格への道 ~入れ子クラス~

スポンサーリンク

こんにちは。たろすです。

今回は入れ子クラスについて説明します。

入れ子クラスとは

入れ子クラスとはブロック{}内に宣言されたクラスのことを指します。

入れ子クラスにはメンバークラス、ローカルクラス、staticメンバークラスがあり、static以外の入れ子クラスのことを内部クラスと呼びます。

f:id:talosta:20211106123821p:plain

また、入れ子クラスは名前を付けないこともでき、そのような入れ子クラスを匿名クラスと呼びます。

それぞれ例を見ながら説明していきます。

メンバークラス

メンバークラスはクラスのメンバーとして宣言されるクラスです。

public class Outer {
	public class Member {
		public void print() {
			System.out.println("This is member class.");
		}
	}
}

Memberがメンバークラスにあたります。

Outerクラスの外部のクラスから使用するときは以下のように使います。

public class Main {
	public static void main(String[] args) {
		Outer.Member member = new Outer().new Member();
		member.print();
	}
}
This is member class.

インスタンスの生成の仕方が普通のクラスとは少し違います。

new 外側のクラスのコンストラクタ.new 内部クラスのコンストラクタ

というように記述します。

それに合わせて変数宣言のほうも形が少し変わっています。

外側のクラス名.内側のクラス名 変数名

ローカルクラス

ローカルクラスはメソッド内で宣言されるクラスです。

public class Outer {
	public void print() {
		class Local {
			public String str = "This is local class.";
		}

		Local local = new Local();
		System.out.println(local.str);
	}
}

Localクラスはprint()メソッドの中で宣言されているためローカルクラスにあたります。

Outerクラスの外部から使うときは以下のように使います。

public class Main {
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.print();
	}
}
This is local class.

staticメンバークラス

staticメンバークラスはstaticで宣言されたメンバークラスです。

public class Outer {
	public class StaticMember {
		public void print() {
			System.out.println("This is static member class.");
		}
	}
}
public class Main {
	public static void main(String[] args) {
		Outer.StaticMember member = new Outer().new StaticMember();
		member.print();
	}
}
This is static member class.

staticメンバークラスはメンバークラスにstatic属性がついたこと以外は同じです。

匿名クラス

匿名クラスは名前を持たないクラスです。

主にインタフェースの実装のために使われます。

public interface Sample {
	void print();
}
public class Main {
	public static void main(String[] args) {
		new Sample() {
			public void print() {
				System.out.println("This is anonymous calss.");
			}
		}.print();
	}
}
This is anonymous calss.

普通インタフェースはあるクラスにimplementsし、そのクラスで抽象メソッドを実装します。

しかし、ここではnew Sample() {}の中で実装しています。

これが匿名クラスです。

匿名クラスとして実装することで、インタフェースをimplementsするクラスが不要になります。

おわりに

今回は入れ子クラスについて説明しました。