я хочу знать, почему 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;
}
}
Когда вы создаете экземпляр a
и b
в приведенном выше примере, какое значение будет правильным для статической переменной count
? Определить его невозможно, поскольку существование InnerData
класса полностью зависит от каждого из окружающих объектов.
Вот почему, когда класс объявлен как static
, ему больше не нужен живой экземпляр, чтобы жить самим собой. Теперь, когда нет зависимости, вы можете свободно объявлять статический атрибут.
Я думаю, это звучит повторяюще, но если вы подумаете о различиях между атрибутами экземпляра и класса, это будет иметь смысл.