я хочу знати, чому 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
, йому вже не потрібен живий екземпляр, щоб жити самим собою. Тепер, коли немає залежності, ви можете вільно оголосити статичний атрибут.
Я думаю, це звучить повторно, але якщо задуматися про різницю між атрибутами екземпляра та класу, це матиме сенс.