2009-06-23 18 views
13

Per curiosità, perché a volte vengono generati più file .class Java per una classe dopo la compilazione? Ad esempio, la mia applicazione ha sei classi. Per una classe, è stato generato un totale di 10 file .class, a partire da MyClass # 1 fino a MyClass # 10.File .class multipli generati per una classe?

risposta

26

Questi sono per inner classes e static nested classes. Quelli con i numeri sono classi interne anonime.

Ad esempio:


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

Ciò produrrà file di classe Foo.class, Foo$Bar.class, Foo$Baz.class e Foo$1.class (per l'implementazione dell'interfaccia Helper)

+0

Terminologia: non solo "classi interne" ma tutte "classi nidificate" sono compilate in tali file –

+0

Vero - Ho aggiornato la risposta per rispecchiare questo –

+0

Non dimenticare di classi anonime. Tecnicamente sono già coperti da "classi interne" ma non sempre sembrano classi, quindi le persone forse si sorprendono nel vederli apparire. Inoltre, il nuovo Java 8 lambda sembra che genererà classi aggiuntive al momento della compilazione. – ArtB

4

Un file sorgente Java in grado di generare file di classe multipli, se la tua classe contiene classi interne. Le classi interne anonime sono rappresentate dai tuoi file di classe numerati.

2

Ogni classe in java appartiene a un file .java, ma un file .java può contenere più classi. Questo include classi interne e anonime. I file .class generati per le classi interne contengono un '$' nel loro nome. Le classi interne anonime ottengono numeri.

5

È possibile ottenere più fils .class da un singolo file di origine se

  • la classe contiene classi interne o classi interne statiche. Le classi interne possono nidificare. I loro nomi sono <outer class name>$<inner class name>.

  • interfacce interne che sono sempre statiche.

  • anonimi classi interne (che in realtà sono semplici classi interne senza un nome) interfacce di accesso

  • pacchetto e le classi prima e dopo la classe principale. È possibile avere un numero arbitrario di classi e interfacce di accesso al pacchetto in un singolo file sorgente Java. Solitamente gli oggetti helper di piccole dimensioni utilizzati solo dalla classe vengono inseriti nello stesso file.

0

da aggiungere alle risposte di cui sopra, questo è un altro buon esempio di classi interne generate sulla base di comparatori (ogni comparatore viene compilato in un diverso MiaClasse $ X.class):

public class MyClass { 
    ... 

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

    ... 
} 
0

Se esiste un file X.java e se contiene 4 collections.sort() {}, quindi dopo la compilazione X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class verrà generato.

In caso di classe interna e classe interna statica vengono generati altri file .class.

Problemi correlati