я хочу знать, почему java запрещает статические поля / методы внутри внутренних классов
Потому что эти внутренние классы являются внутренними классами "экземпляра". То есть они похожи на атрибут экземпляра охватывающего объекта.
Поскольку они являются «экземпляровыми» классами, нет никакого смысла разрешать static
функции, поскольку static
изначально предназначен для работы без экземпляра.
Это как если бы вы одновременно пытались создать статический / экземплярный атрибут.
Возьмем следующий пример:
class Employee {
public String name;
}
Если вы создаете два экземпляра сотрудника:
Employee a = new Employee();
a.name = "Oscar";
Employee b = new Employee();
b.name = "jcyang";
Понятно, почему у каждого свое значение свойства name
, верно?
То же самое происходит с внутренним классом; каждый экземпляр внутреннего класса не зависит от другого экземпляра внутреннего класса.
Поэтому, если вы попытаетесь создать атрибут класса counter
, невозможно будет разделить это значение между двумя разными экземплярами.
class Employee {
public String name;
class InnerData {
static count; // ??? count of which ? a or b?
}
}
Когда вы создаете экземпляр a
и b
в приведенном выше примере, какое значение будет правильным для статической переменной count
? Определить его невозможно, потому что существование класса InnerData
полностью зависит от каждого из окружающих объектов.
Вот почему, когда класс объявлен как static
, ему больше не нужен живой экземпляр, чтобы жить сам по себе. Теперь, когда нет зависимости, вы можете свободно объявлять статический атрибут.
Я думаю, это звучит повторяюще, но если вы подумаете о различиях между атрибутами экземпляра и класса, это будет иметь смысл.
23.12.2009