Welcher Teil von JLS sagte, dass anonyme Klassen keine öffentlichen / geschützten / privaten Mitgliederklassen haben können

Betrachten Sie diesen Code:

public class TopLevelClass {
    Cloneable c = new Cloneable() {
        private int privateField;
        private void privateMethod() {};
    };
}

Es gibt eine anonyme Klasse mit einemprivate Mitgliedsfeld und aprivate Mitglied Methode. Es wurde erfolgreich kompiliert.

Dann überlege dir folgendes:

public class TopLevelClass {
    Cloneable c = new Cloneable() {
        private class PrivateInnerClass {}
    };
}

Es gibt eine anonyme Klasse mit einemprivate Mitgliederklasse. Jedoch...

Javac sagte:error: modifier private not allowed hereEclipse sagte:Illegal modifier for the local class PrivateInnerClass; only abstract or final is permitted Wirklich lokale Klasse?

Was?Warum anonyme Klassen nicht haben könnenpublic, protected oderprivate(im Weiteren bezeichnet alsthose) Mitgliederklassen, während sie haben könnenthose Mitgliedsfelder und Methoden? Verwirrt schaute ich in JLS. Aufgrund dessen, was Eclipse sagte, habe ich mich umgesehenlokale Klassen zuerst:

14.3. Lokale Klassendeklarationen

A lokale Klasse ist eine verschachtelte Klasse (§8) das keiner Klasse angehört und einen Namen hat (§6.2, §6.7).
Es ist ein Fehler beim Kompilieren, wenn eine lokale Klassendeklaration einen der Zugriffsmodifikatoren enthältpublic, protected, oderprivate (§6.6) oder den Modifikatorstatic (§8.1.1).

So kann lokale Klasse nicht habenthose Modifikatoren. AberPrivateInnerClass ist ein Mitglied der anonymenCloneableEs ist also keine lokale Klasse und kann es immer noch habenthose Modifikatoren.

Dann habe ich nachgesehenKlassenmodifikatoren:

8.1.1. Klassenmodifikatoren

Der Zugriffsmodifikatorpublic (§6.6) betrifft nur Klassen der obersten Ebene (§7.6) und zu Mitgliederklassen (§8.5), nicht zu lokalen Klassen (§14.3) oder anonyme Klassen (§15.9.5).
Die Zugriffsmodifikatorenprotected undprivate (§6.6) beziehen sich nur auf Member-Klassen innerhalb einer direkt einschließenden Klassen- oder Enum-Deklaration (§8.5).

AberPrivateInnerClass ist eine Mitgliederklasse und befindet sich in einer direkt einschließenden Klasse, der anonymenCloneablekann es also noch habenthose Modifikatoren für die Theorie. Ich habe auch in andere Teile geschaut, aber ich konnte immer noch keine relevanten Bestimmungen finden.

Welcher Teil der Java-Sprachspezifikation besagt, dass eine Member-Klasse einer anonymen Klasse nicht haben kannthose Modifikator?

Zusätzliche Anmerkung 1: In einigen Antworten wurde über Member-Klassen und lokale Klassen gestritten, daher habe ich einen Test durchgeführt, der darauf schließen kann (es sei denn, Modifikatoren spielen eine Rolle):

Der anonymeCloneable istWeder eine Mitgliederklasse noch eine lokale Klasse.DasPrivateInnerClass ist eine Mitgliederklasse, aberkeine lokale Klasse.

Das Folgende ist mein Testcode:

public class TopLevelClass {
    Cloneable c = new Cloneable() {
        class PrivateInnerClass {}
    };

    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> c1 = Class.forName("TopLevelClass$1");
        Class<?> c2 = Class.forName("TopLevelClassEs gibt eine anonyme Klasse mit einemPrivateInnerClass");
        System.out.println(c1.isMemberClass()); // false
        System.out.println(c1.isLocalClass()); // false
        System.out.println(c2.isMemberClass()); // true
        System.out.println(c2.isLocalClass()); // false
    }
}

Zusätzliche Anmerkung 2: Überprüfen Sie die Deklaration einer normalen Klasse (JLS §8.1):

NormalClassDeclaration:
    ClassModifiersopt class Identifier TypeParametersopt
                                               Superopt Interfacesopt ClassBody

Nach meinem Verständnis, wenn dieIdentifier Klasse ist eine XXX-Klasse, was§8.1.1 angegeben ist die Einschränkung des Modifikators vonIdentifier, nicht die Modifikatoren in anderen Deklarationen inClassBody vonIdentifier. Ansonsten können anonyme Klassen nicht einmal habenthose Mitgliedsfelder und Methoden.

Jede Antwort, insbesondere wenn sie nicht mit der Zusätzlichen Anmerkung 2 übereinstimmt, muss den Grund dafür angebenthose Mitgliedsfelder und Methoden sind erlaubt.

Zusätzliche Anmerkung 3: Wenn Sie denken, dass es keinen solchen Teil von JLS gibt,Sie müssen immer noch ein zuverlässiges Dokument vorlegen, um zu erklären, warumthose Mitgliederklassen sind verboten und warumthose Mitgliedsfelder und Methoden sind erlaubt.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage