Pergunta

Por curiosidade, por que, às vezes, são vários Java .classe de arquivos gerados para uma classe depois de compilação?Por exemplo, a minha candidatura tem seis classes.Para uma classe, de um total de 10 .arquivos de classe foi gerada, a partir de MyClass#1 até MyClass#10.

Foi útil?

Solução

Estes são para Classes internas e classes aninhadas estáticas. Os com números são classes internas anônimas.

Por exemplo:


class Foo {
   class Bar { }
   static class Baz { }
   void run() {
      Helper t = new Helper() {
         int helpMethod() {
            return 2;
         }
      };
    }
}

Isso produzirá arquivos de classe Foo.class, Foo$Bar.class, Foo$Baz.class e Foo$1.class (para a implementação do Helper interface)

Outras dicas

Você ganha mais .classe fils a partir de um único arquivo de origem se

  • a classe contém classes internas ou estáticos de classes internas.Classes internas podem ninho.Seus nomes são <outer class name>$<inner class name>.

  • interior interfaces que são sempre estáticos.

  • anônimo classes internas (que na verdade são simples classes internas sem nome)

  • pacote de acesso para interfaces e classes antes e depois da sua classe principal.Você pode ter um número arbitrário de acesso de pacote de classes e interfaces em um único arquivo de origem Java.Normalmente pequeno, auxiliar de objetos que são usados apenas pela classe são apenas colocados no mesmo arquivo.

Um arquivo de origem Java pode gerar vários arquivos de classe, se sua classe contiver classes internas. As classes internas anônimas são representadas pelos seus arquivos de classe numerados.

Toda classe em Java pertence a um arquivo .java, mas um arquivo .java pode conter várias classes. Isso inclui aulas internas e anônimas. Os arquivos .classe gerados para classes internos contêm um '$' em seu nome. Aulas internas anônimas obtêm números.

Para adicionar às respostas acima, este é outro bom exemplo de classes internas geradas com base em comparadores (Cada comparador é compilado em um diferente MyClass $ x.class):

public class MyClass {
    ...

    public void doSomething() {
        ...
        Collections.sort(list, new Comparator<MyObj>() {
            public int compare(MyObj o1, MyObj o2) {
                ...
            }
        });
        ...
    }

    ...
}

Se houver um arquivo x.java e se ele contiver 4 coleções.sort () {}, após a compilação x.class, x $ 1.Class, x $ 2.Class, x $ 3.Class, x $ 4.Class será gerado.

No caso de classe interna e da classe estática interna, mais arquivos .class são gerados.

Mais de uma classe será gerada na compilação, apenas se sua classe estiver tendo classe interna.

referir:Por que o código Java com uma classe interna gera um terceiro arquivo de US $ 1.Class?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top