o que eu quero saber é por que o java proíbe campos / métodos estáticos dentro de classes internas
Porque essas classes internas são classes internas de "instância". Ou seja, eles são como um atributo de instância do objeto envolvente.
Visto que são classes de "instância", não faz nenhum sentido permitir static
recursos, pois static
foi criado para funcionar sem uma instância em primeiro lugar.
É como se você tentasse criar um atributo estático / instância ao mesmo tempo.
Veja o seguinte exemplo:
class Employee {
public String name;
}
Se você criar duas instâncias de funcionário:
Employee a = new Employee();
a.name = "Oscar";
Employee b = new Employee();
b.name = "jcyang";
Fica claro porque cada um tem seu valor pelo imóvel name
, certo?
O mesmo acontece com a classe interna; cada instância de classe interna é independente da outra instância de classe interna.
Portanto, se você tentar criar um counter
atributo de classe, não haverá como compartilhar esse valor entre duas instâncias diferentes.
class Employee {
public String name;
class InnerData {
static count;
}
}
Quando você cria a instância a
e b
no exemplo acima, qual seria o valor correto para a variável estática count
? Não é possível determiná-lo, porque a existência da InnerData
classe depende totalmente de cada um dos objetos envolventes.
É por isso que, quando a classe é declarada como static
, ela não precisa mais de uma instância viva para viver a si mesma. Agora que não há dependência, você pode declarar livremente um atributo estático.
Eu acho que isso parece reiterativo, mas se você pensar sobre as diferenças entre atributos de instância e classe, fará sentido.