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

Si tengo una clase interna, así:

public class Test { public class Inner { // code ... } public static void main(String[] args) { // code ... } } 

Cuando lo compilo, espero que genere dos archivos:

 Test.class Test$Inner.class 

Entonces, ¿por qué a veces veo archivos de clase como SomeClass $ 1.class, aunque SomeClass no contiene una clase interna llamada “1”?

Los SomeClass $ 1.class representan clases internas anónimas

eche un vistazo a la sección de clase interna anónima aquí

También obtendrá algo como SomeClass$1.class si su clase contiene una clase interna privada (no anónima) pero la crea en algún momento de la clase principal.

Por ejemplo:

 public class Person { private class Brain{ void ponderLife() { System.out.println("The meaning of life is..."); } } Person() { Brain b = new Brain(); b.ponderLife(); } } 

Esto rendiría:

 Person.class Person$Brain.class Person$1.class 

Personalmente, creo que es un poco más fácil de leer que una clase anónima típica, especialmente cuando se implementa una interfaz simple o una clase abstracta que solo sirve para pasar a otro objeto local.

para construir en hhafez: SomeClass $ 1.class representa clases internas anónimas. Un ejemplo de tal clase sería

 public class Foo{ public void printMe(){ System.out.println("redefine me!"); } } public class Bar { public void printMe() { Foo f = new Foo() { public void printMe() { System.out.println("defined"); } }; f.printMe(); } } 

Desde un Main normal, si llamaste a new Bar (). PrintMe imprimiría “defined” y en el directorio de comstackción encontrarás Bar1.class

esta sección en el código anterior:

  Foo f = new Foo() { public void printMe() { System.out.println("defined"); } }; 

se llama una clase interna anónima.