Domanda

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, sono stati generati un totale di 10 file .class, a partire da MyClass # 1 fino a MyClass # 10.

È stato utile?

Soluzione

Questi sono per classi interne e classi nidificate statiche . Quelli con numeri sono classi interne anonime.

Ad esempio:


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

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

Altri suggerimenti

Ottieni più file .class da un singolo file sorgente se

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

  • interfacce interne che sono sempre statiche.

  • classi interne anonime (che in realtà sono semplici classi interne senza nome)

  • interfacce di accesso al pacchetto e 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. Di solito piccoli oggetti helper utilizzati solo dalla classe vengono semplicemente inseriti nello stesso file.

Un file sorgente Java può generare più file di classe, se la tua classe contiene classi interne. Le classi interne anonime sono rappresentate dai tuoi file di classe numerati.

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

Per aggiungere alle risposte sopra, questo è un altro buon esempio di classi interne generate sulla base di Comparatori (ogni Comparatore è compilato in una MyClass $ X.class ):

public class MyClass {
    ...

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

    ...
}

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

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

Durante la compilazione verrà generata più di una classe, solo se la tua classe ha una classe interna.

vedi: Perché il codice Java con una classe interna genera un terzo file SomeClass $ 1.class?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top