2009-06-23 3 views
13

Aus Neugier, warum werden manchmal mehrere Java-.class-Dateien für eine Klasse nach der Kompilierung generiert? Zum Beispiel hat meine Anwendung sechs Klassen. Für eine Klasse wurden insgesamt 10 .class-Dateien generiert, angefangen von MyClass # 1 bis MyClass # 10.Mehrere .class-Dateien für eine Klasse generiert?

Antwort

26

Diese sind für inner classes und static nested classes. Die mit Zahlen sind anonyme innere Klassen.

Zum Beispiel:


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

Diese Klasse produzieren Dateien Foo.class, Foo$Bar.class, Foo$Baz.class und Foo$1.class (für die Umsetzung der Helper Schnittstelle)

+0

Terminologie: Nicht nur "innere Klassen", sondern alle "verschachtelten Klassen" sind in solche Dateien kompiliert –

+0

True - Ich habe die Antwort aktualisiert, um dies zu reflektieren –

+0

Vergessen Sie nicht über anonyme Klassen. Technisch sind sie bereits von "inneren Klassen" bedeckt, aber sie sehen nicht immer wie Klassen aus, so dass die Leute vielleicht überrascht sind, wenn sie erscheinen. Außerdem sehen die neuen Java 8-lambdas so aus, als würden sie beim Kompilieren zusätzliche Klassen generieren. – ArtB

4

Eine Java-Quelldatei mehrere Klassendateien erzeugen kann, wenn Ihre Klasse enthält innere Klassen. Anonyme innere Klassen werden durch Ihre nummerierten Klassendateien repräsentiert.

2

Jede Klasse in Java gehört zu einer .java-Datei, aber eine .java-Datei kann mehrere Klassen enthalten. Dazu gehören innere und anonyme Klassen. Die für innere Klassen generierten .class-Dateien enthalten in ihrem Namen ein '$'. Anonyme innere Klassen erhalten Zahlen.

-2

Bei der Kompilierung wird mehr als eine Klasse generiert. Nur wenn Ihre Klasse eine innere Klasse hat.

verweisen: Why does Java code with an inner class generates a third SomeClass$1.class file?

+1

Nun, eine Quelldatei kann auch separate, nicht verschachtelte Klassen enthalten (wenn sie nicht öffentlich sind). –

+1

nicht nur, wenn es innere Klassen hat (es gibt auch anonyme Klassen, verschachtelte Klassen, ...). –

5

Sie mehr .class- fils aus einer einzigen Quelldatei, wenn

  • die Klasse innere Klassen oder statische innere Klassen enthält. Innere Klassen können verschachteln. Ihre Namen sind .

  • innere Schnittstellen, die immer statisch sind.

  • anonyme innere Klassen (die ohne Namen Ebene innere Klassen sind in der Tat)

  • Paketzugriffs Schnittstellen und Klassen vor und nach dem Hauptklasse. Sie können eine beliebige Anzahl von Pakezugriffsklassen und Schnittstellen in einer einzelnen Java-Quelldatei haben. In der Regel werden kleine Hilfsobjekte, die nur von der Klasse verwendet werden, einfach in dieselbe Datei eingefügt.

0

auf die Antworten oben hinzuzufügen, dies ein weiteres gutes Beispiel für erzeugte innere Klassen auf Comparators basiert ist (jeder Komparator in einem anderen MyClass $ X.class kompiliert wird):

public class MyClass { 
    ... 

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

    ... 
} 
0

Wenn es eine X.java-Datei gibt und wenn sie 4 collections.sort() {} enthält, dann nach dem Kompilieren von X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class wird generiert.

Im Fall der inneren Klasse und der statischen inneren Klasse werden mehr .class-Dateien generiert.