2009-06-23 14 views
13

Por curiosidad, ¿por qué a veces se generan múltiples archivos .class de Java para una clase después de la compilación? Por ejemplo, mi aplicación tiene seis clases. Para una clase, se han generado un total de 10 archivos .class, comenzando desde MyClass # 1 hasta MyClass # 10.Múltiples archivos .class generados para una clase?

Respuesta

26

Estos son para inner classes y static nested classes. Los que tienen números son clases internas anónimas.

Por ejemplo:


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

Esto producirá archivos de clase Foo.class, Foo$Bar.class, Foo$Baz.class y Foo$1.class (para la implementación de la interfaz Helper)

+0

Terminología: no solo "clases internas", sino que todas las "clases anidadas" se compilan en dichos archivos –

+0

Es cierto - He actualizado la respuesta para que refleje esto –

+0

No se olvide de las clases anónimas. Técnicamente ya están cubiertos por "clases internas", pero no siempre se ven como clases, por lo que la gente puede sorprenderse de verlas aparecer. Además, las nuevas lambdas Java 8 parecen estar generando clases adicionales cuando se compilan. – ArtB

4

Un archivo fuente de Java puede generar múltiples archivos de clase, si tu clase contiene clases internas Las clases internas anónimas están representadas por los archivos de clase numerados.

2

Cada clase en java pertenece a un archivo .java, pero un archivo .java puede contener múltiples clases. Eso incluye clases internas y anónimas. Los archivos .class generados para clases internas contienen un '$' en su nombre. Las clases internas anónimas obtienen números.

5

Usted obtiene más fils .class desde un único archivo de origen si

  • la clase contiene las clases internas o clases internas estáticas. Las clases internas pueden anidar. Sus nombres son <outer class name>$<inner class name>.

  • interfaces internas que son siempre estáticas.

  • clases anónimas internas (que en realidad son las clases internas lisas sin nombre) interfaces de acceso

  • paquete y clases antes y después de su clase principal. Puede tener un número arbitrario de clases e interfaces de acceso a paquetes en un solo archivo fuente Java. Por lo general, los pequeños objetos auxiliares que solo utiliza la clase se colocan en el mismo archivo.

0

Para añadir a las respuestas anteriores, este es otro buen ejemplo de las clases internas generadas en base a comparadores (cada comparador se compila en una diferente MiClase $ X.class):

public class MyClass { 
    ... 

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

    ... 
} 
0

Si hay un archivo X.java y si contiene 4 collections.sort() {} luego de la compilación X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class se generará

En el caso de la clase interna y la clase interna estática se generan más archivos .class.

Cuestiones relacionadas