私が知りたいのは、Javaが内部クラス内の静的フィールド/メソッドを禁止している理由です
これらの内部クラスは「インスタンス」内部クラスであるためです。つまり、それらは囲んでいるオブジェクトのインスタンス属性のようなものです。
これらは「インスタンス」クラスであるため、static
機能を許可することは意味がありませんstatic
。そもそもインスタンスなしで機能することを目的としています。
これは、静的/インスタンス属性を同時に作成しようとするようなものです。
次の例を見てください。
class Employee {
public String name;
}
従業員の2つのインスタンスを作成する場合:
Employee a = new Employee();
a.name = "Oscar";
Employee b = new Employee();
b.name = "jcyang";
それぞれがプロパティに対して独自の値を持っている理由は明らかname
ですよね?
同じことが内部クラスでも起こります。各内部クラスインスタンスは、他の内部クラスインスタンスから独立しています。
したがって、counter
クラス属性を作成しようとすると、2つの異なるインスタンス間でその値を共有する方法はありません。
class Employee {
public String name;
class InnerData {
static count;
}
}
インスタンスを作成するとa
し、b
上記の例では、何が静的変数に正しい値でしょうかcount
?InnerData
クラスの存在は、囲んでいる各オブジェクトに完全に依存しているため、それを判別することはできません。
そのため、クラスがとして宣言されstatic
ている場合、それ自体を生きるために、生きているインスタンスはもう必要ありません。依存関係がなくなったので、静的属性を自由に宣言できます。
これは繰り返しのように聞こえると思いますが、インスタンス属性とクラス属性の違いを考えると、理にかなっています。