Qual parte do JLS disse que classes anônimas não podem ter classes de membros públicos / protegidos / privados

Considere este pedaço de código:

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

Existe uma classe anônima que tem umprivate campo de membro e umprivate método de membro. Foi compilado com sucesso.

Então considere este:

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

Existe uma classe anônima que tem umprivate classe de membro. Contudo...

javac disse:error: modifier private not allowed hereEclipse disse:Illegal modifier for the local class PrivateInnerClass; only abstract or final is permitted Classe realmente local?

O que?Por que classes anônimas não podem terpublic, protected ouprivate(a seguir designado porthose) classes de membros, enquanto eles podem terthose campos e métodos de membro? Confuso, eu olhei para o JLS. Por causa do que Eclipse afirmou, eu olheiclasses locais primeiro:

14.3. Declarações de Classe Local

A classe local é uma classe aninhada (§8) que não é membro de nenhuma classe e que tem um nome (§6.2, §6.7).
É um erro em tempo de compilação se uma declaração de classe local contiver algum dos modificadores de acessopublic, protectedouprivate (§6.6), ou o modificadorstatic (§8.1.1).

Então, a classe local não pode terthose modificadores. MasPrivateInnerClass é um membro do anônimoCloneable, então não é uma classe local e ainda é capaz de terthose modificadores.

Então eu olhei paramodificadores de classe:

8.1.1. Modificadores de Classe

O modificador de acessopublic (§6.6) refere-se apenas a classes de nível superior (§7.6) e para classes de membros (§8.5), não para as classes locais (§14.3) ou classes anônimas (§15.9.5).
Os modificadores de acessoprotected eprivate (§6.6) referem-se apenas a classes membro dentro de uma classe de inclusão direta ou declaração enum (§8.5).

MasPrivateInnerClass é uma classe membro, e é dentro de uma classe de inclusão direta, o anônimoCloneable, então ainda pode terthose modificadores na teoria. Eu olhei em outras partes também, mas ainda não consegui encontrar disposições relevantes.

Então, qual parte da Especificação de Linguagem Java disse que uma classe de membro de uma classe anônima não pode terthose modificador?

Nota extra 1: Alguma resposta argumentou sobre classes de membros e classes locais, então fiz um teste que pode concluir isso (a menos que modificadores importem):

O anônimoCloneable énem uma classe membro nem uma classe local.oPrivateInnerClass é uma classe de membro, masnão é uma classe local.

O seguinte é o meu código de teste:

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("TopLevelClassExiste uma classe anônima que tem umPrivateInnerClass");
        System.out.println(c1.isMemberClass()); // false
        System.out.println(c1.isLocalClass()); // false
        System.out.println(c2.isMemberClass()); // true
        System.out.println(c2.isLocalClass()); // false
    }
}

Nota Extra 2: Revise a declaração de uma classe normal (JLS §8.1):

NormalClassDeclaration:
    ClassModifiersopt class Identifier TypeParametersopt
                                               Superopt Interfacesopt ClassBody

No meu entendimento, quando oIdentifier classe é uma classe XXX, o que§8.1.1 afirmou está restringindo o modificador deIdentifier, não os modificadores em outras declarações emClassBody doIdentifier. Caso contrário, as classes anônimas ainda não podem terthose campos e métodos do membro.

Qualquer resposta, especialmente que discorde da Nota Extra 2, deve apontar o motivothose campos e métodos de membro são permitidos.

Nota Extra 3: Se você acha que não existe tal parte do JLS,você ainda precisará fornecer um documento confiável para explicar por quethose classes de membros são proibidas e porquethose campos e métodos de membro são permitidos.

questionAnswers(3)

yourAnswerToTheQuestion