я хочу знать, почему java запрещает статические поля / методы внутри внутренних классов
Потому что эти внутренние классы являются "экземплярами" внутренних классов. То есть они похожи на атрибут экземпляра окружающего объекта.
Поскольку они являются "экземплярами" классов, не имеет смысла разрешать static
функции, поскольку static
предназначен для работы без экземпляра.
Как будто вы пытаетесь создать атрибут static / instance одновременно.
Возьмите следующий пример:
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
, ему больше не нужен живой экземпляр, чтобы жить самому. Теперь, когда нет никакой зависимости, вы можете свободно объявлять статический атрибут.
Я думаю, это звучит многократно, но если вы подумаете о различиях между атрибутами экземпляра и класса, это будет иметь смысл.