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...
error: modifier private not allowed here
Eclipse 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:
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 anonymenCloneable
Es ist also keine lokale Klasse und kann es immer noch habenthose
Modifikatoren.
Dann habe ich nachgesehenKlassenmodifikatoren:
8.1.1. KlassenmodifikatorenDer 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 anonymenCloneable
kann 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.