WisdomSoft - for your serial experiences.

6.6 静的メンバ・クラス

static で修飾されたメンバ・クラスは、囲んでいるクラスとのインスタンスとは関連付けられず、単にクラスのスコープ内にあるクラス型として機能します。

6.6.1 クラス内の非内部クラス

メンバ・クラスの宣言では、static 修飾子を指定することができます。メンバ・クラスは囲んでいるクラスのインスタンスと関連付けられていましたが、クラス宣言に static 修飾子を指定することでインスタンスとの関連を断ち切ることができます。内部クラスの定義は static として宣言されていない他のクラスに囲まれているクラスとされているため、静的なメンバ・クラスは内部クラスとは定義されません。

静的なメンバ・クラスは、性質はトップレベルのクラスと同じです。単純に、クラスのスコープが囲んでいるクラスの影響を受けるというだけです。クラスを外部から隠蔽したり、囲んでいるクラスの2次的な管理を行うクラスを作成するために利用することができるでしょう。静的なメンバ・クラスは内部クラスではないため、static メンバを宣言したり、静的初期化子を指定することが可能です。

コード1
class Parent {
	public static class Child {
		public static String str = "Kitty on your lap";
		public String toString() {
			return super.toString() + " : " + str;
		}
	}
}

class Test {
	public static void main(String args[]) {
		Parent.Child obj = new Parent.Child();
		System.out.println(obj);
	}
}
実行結果
>java Test
Parent$Child@c78e57 : Kitty on your lap

コード1の Parent クラスでは、メンバに static メンバ・クラス Child が宣言されています。このクラスは static が指定されてあるため、囲んでいるクラス Parent のインスタンスの影響は受けません。そのため、内部クラスのように Parent クラスのインスタンス・メンバに単純名でアクセスすることはできません。Child クラスは、トップレベルではありませんがクラスとしては独立しているのです。

Child クラスのメンバには、クラス変数 str が宣言されています。内部クラスは final が指定されているクラス変数を除いて static メンバを指定することができませんでしたが、static クラスである Child は内部クラスではないので static メンバの静的初期化子を記述することが可能です。

Parent 以外のクラスから Child クラスを参照するには、囲んでいるクラスである Parent を指定した限定名を用いる必要があります。Test クラスの main() メソッドで Parent.Child として参照していることに注目してください。しかし、Child クラスは囲んでいるクラスのインスタンスの影響を受けないため、内部クラスのメンバ・クラスとは異なり new にインスタンスを指定する必要はありません。