Pregunta

Por curiosidad, ¿por qué a veces son múltiples Java .la clase de los archivos generados para una clase después de la compilación?Por ejemplo, mi solicitud ha de seis clases.Para una clase, de un total de 10 .los archivos de clase que se ha generado, a partir de Miclase#1 hasta Miclase#10.

¿Fue útil?

Solución

Estos son para las clases internas y estática de las clases anidadas.Los números son anónimos interior de las clases.

Por ejemplo:


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

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

Otros consejos

Obtiene más archivos .class de un único archivo fuente si

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

  • interfaces internas que siempre son estáticas.

  • clases internas anónimas (que de hecho son clases internas simples sin nombre)

  • interfaces de acceso a paquetes 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 objetos auxiliares pequeños que solo son utilizados por la clase se colocan en el mismo archivo.

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

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

Para agregar a las respuestas anteriores, este es otro buen ejemplo de clases internas generadas basadas en Comparadores (cada Comparador se compila en un MyClass $ X.class diferente ):

public class MyClass {
    ...

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

    ...
}

Si hay un archivo X.java y si contiene 4 colecciones.sort () {}, luego de la compilación X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class will ser generado.

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

Se generará más de una clase en la compilación, solo si su clase tiene clase interna.

referir: ¿Por qué el código Java con una clase interna genera un tercer archivo SomeClass $ 1.class?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top