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...
error: modifier private not allowed here
Eclipse 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:
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
, protected
lubprivate
(§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 klasModyfikator 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.