Una classe può essere creato in un contesto statico, senza essere dichiarato statico, e questo è ciò che sta accadendo Qui. Diamo un'occhiata a ciò che viene dichiarato statica, e ha creato in un contesto statico significa:
La differenza tra una classe anonima creata in un contesto statico e un contesto non statico è se ha un'istanza allegando:
Se C è una classe anonima, quindi:
Se l'espressione creazione dell'istanza classe avviene in un contesto statico, allora i ha non immediatamente racchiude esempio.
Altrimenti, l'istanza di i immediatamente racchiusa è questa.
Una classe annidata che viene dichiarata static consente ai membri statici:
Una classe interna è una classe annidata che non sia esplicitamente o implicitamente dichiarata statica.
Una classe nidificata che non è una classe interna può dichiarare membri statici liberamente, in conformità con le solite regole della lingua Java .
Dicendo una classe annidata che è 'implicitamente dichiarata static', si riferisce a cose come le classi all'interno di interfacce:
Una classe membro di un'interfaccia è implicitamente statico (§9.5) quindi non è mai considerata una classe interiore.
classi anonimi non sono dichiarate static (né in modo esplicito con una parola chiave, o implicitamente come essere all'interno di un'interfaccia), e quindi non consentono la dichiarazione di membri statici. Possono tuttavia essere creati all'interno di un contesto statico, il che significa che non si riferiscono a un'istanza che li include.
Poiché le classi anonime non sono dichiarate statiche, entrambe le virgolette nella domanda sono coerenti.
'B b = nuovo B() {};' non è una classe anonima.E funziona perché è * usato in * un contesto statico, sta dichiarando la classe interna stessa statica che è proibita. –
@Shywim Quindi quale tipo era l'oggetto creato da 'new B() {}'? –