2008-12-19 10 views
17

Si tengo una clase interna, así:

public class Test 
{ 
    public class Inner 
    { 
     // code ... 
    } 

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

Cuando compilo, espero que debe generar dos archivos:

Test.class 
Test$Inner.class 

Entonces, ¿por qué a veces veo archivos de clase como SomeClass $ 1. clase, a pesar de que SomeClass no contiene una clase interna llamada "1"?

+0

¿Puede aclarar por qué no vio Test.class y Test $ Inner.class? Supongo que hay otra SomeClass en el mismo paquete que generó los archivos de clase que viste. –

Respuesta

21

El SomeClass $ 1.class representan la clase interna anónima

hava un vistazo a la sección de clase interna anónima here

+1

Tenga en cuenta que los nombres de las clases internas no están especificados por lo que no necesitan ser de esta forma y sería un error confiar en eso. Pero dicho esto, aún no he visto un compilador que genere nombres diferentes. –

3

a acumularse en hhafez: SomeClass $ 1.class representa clases internas anónimas. Un ejemplo de una clase de este tipo 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 el principal normal, si se llama a la nueva barra(). PrintMe que imprimiría "definido" y en el directorio de compilación se encuentra 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.

8

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 produciría:

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

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

+1

¿Por qué javac hace esto? Este caso se solicita más explícitamente en: http://stackoverflow.com/questions/2883181/why-is-an-anonymous-inner-class-containing-nothing-generated-from-this-code –

Cuestiones relacionadas