Która część JLS anonimowych klas nie może mieć publicznych / chronionych / prywatnych klas członków

Rozważ ten fragment kodu:

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

Istnieje anonimowa klasa, która maprivate pole członkowskie i aprivate metoda członka. Został pomyślnie skompilowany.

Następnie rozważ to:

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

Istnieje anonimowa klasa, która maprivate klasa członków. Jednak...

javac powiedział:error: modifier private not allowed hereEclipse powiedział:Illegal modifier for the local class PrivateInnerClass; only abstract or final is permitted Naprawdę lokalna klasa?

Co?Dlaczego anonimowe klasy nie mogą miećpublic, protected lubprivate(dalej zwanethose) klasy członkowskie, podczas gdy mogą miećthose pola członkowskie i metody? Zmieszany spojrzałem na JLS. Z powodu tego, co stwierdził Eclipse, zajrzałem do tegoklasy lokalne pierwszy:

14.3. Lokalne deklaracje klasy

A klasa lokalna jest klasą zagnieżdżoną (§8), który nie jest członkiem żadnej klasy i ma nazwę (§6.2, §6.7).
Jest to błąd czasu kompilacji, jeśli deklaracja klasy lokalnej zawiera dowolny modyfikator dostępupublic, protectedlubprivate (§6.6) lub modyfikatorstatic (§8.1.1).

Więc lokalna klasa nie może miećthose modyfikatory. AlePrivateInnerClass jest członek anonimowyCloneable, więc nie jest klasą lokalną i nadal może miećthose modyfikatory.

Potem zajrzałemmodyfikatory klasy:

8.1.1. Modyfikatory klas

Modyfikator dostępupublic (§6.6) dotyczy tylko klas najwyższego poziomu (§7.6) i klasom członków (§ 8.5), nie do lokalnych klas (§ 14.3) lub anonimowe klasy (§15.9.5).
Modyfikatory dostępuprotected iprivate (§6.6) odnoszą się tylko do klas członków w bezpośrednio otaczającej deklaracji klasy lub enum (§ 8.5).

AlePrivateInnerClass jest klasą członków i mieści się w klasie bezpośrednio otaczającej, anonimowejCloneable, więc nadal może miećthose modyfikatory teorii. Zajrzałem też do innych części, ale wciąż nie mogłem znaleźć odpowiednich przepisów.

Która część specyfikacji języka Java mówi, że klasa członków anonimowej klasy nie może miećthose modyfikator?

Dodatkowa uwaga 1: Pewna odpowiedź spierała się o klasy członków i klasy lokalne, więc zrobiłem test, który może stwierdzić, że (chyba że liczą się modyfikatory):

AnonimowyCloneable jestani klasa członkowska, ani klasa lokalna.ThePrivateInnerClass jest klasą członków, alenie lokalna klasa.

Oto mój kod testowy:

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("TopLevelClassIstnieje anonimowa klasa, która maPrivateInnerClass");
        System.out.println(c1.isMemberClass()); // false
        System.out.println(c1.isLocalClass()); // false
        System.out.println(c2.isMemberClass()); // true
        System.out.println(c2.isLocalClass()); // false
    }
}

Dodatkowa uwaga 2: Przejrzyj deklarację zwykłej klasy (JLS §8.1):

NormalClassDeclaration:
    ClassModifiersopt class Identifier TypeParametersopt
                                               Superopt Interfacesopt ClassBody

W moim rozumieniu, kiedyIdentifier klasa to klasa XXX, co§8.1.1 oświadcza, że ​​ogranicza modyfikatorIdentifier, nie modyfikatory w innych deklaracjach wClassBody zIdentifier. W przeciwnym razie klasy anonimowe nawet nie mogą miećthose pola członkowskie i metody.

Każda odpowiedź, zwłaszcza niezgodna z Dodatkową uwagą 2, musi wskazywać dlaczegothose dozwolone są pola członkowskie i metody.

Dodatkowa uwaga 3: Jeśli uważasz, że nie ma takiej części JLS,nadal musisz podać wiarygodny dokument, aby wyjaśnić dlaczegothose klasy członków są zabronione i dlaczegothose dozwolone są pola członkowskie i metody.

questionAnswers(3)

yourAnswerToTheQuestion