2012-01-18 21 views
10

He visto un par de ejemplos similares a esto en Java, y espero que alguien pueda explicar lo que está sucediendo. Parece que una nueva clase se puede definir en línea, lo que me parece realmente extraño. Se espera la primera línea impresa, ya que es simplemente el toString. Sin embargo, el segundo parece que la función puede ser anulada en línea. ¿Hay un término técnico para esto? O cualquier documentación que profundiza? ¡Gracias!Java - definición de clase en línea

Si tengo el siguiente código:

public class Apple { 
    public String toString() { 
     return "original apple"; 
    } 
} 

public class Driver { 
    public static void main(String[] args) { 
     System.out.println("first: " + new Apple()); 
     System.out.println("second: " + 
      new Apple() { 
       public String toString() { 
        return "modified apple"; 
       } 
      } 
     ); 
    } 
} 

Las salidas de código:

first: original apple 
second: modified apple 

Respuesta

15

Es una clase interna anónima. Puede encontrar más información al respecto en el enlace de documentación de Java para Inner Classes. EDITAR Estoy agregando un better link describiendo clases internas anónimas, ya que la documentación de Java deja algo que desear. /EDIT

La mayoría de la gente va a usar Anónimo clases internas para definir los oyentes sobre la marcha. Considere este escenario:

Tengo un Button, y cuando hago clic en él, quiero que muestre algo a la consola. Pero no quiero tener que crear una nueva clase en un archivo diferente, y no quiero tener que definir una clase interna más adelante en este archivo, quiero que la lógica esté inmediatamente disponible aquí.

class Example { 
    Button button = new SomeButton(); 

    public void example() { 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(SomeClickEvent clickEvent) { 
       System.out.println("A click happened at " + clickEvent.getClickTime()); 
      } 
     }); 
    } 

    interface OnClickListener { 
     void onClick(SomeClickEvent clickEvent); 
    } 

    interface Button { 
     void setOnClickListener(OnClickListener ocl); 
    } 
} 

El ejemplo es un tanto artificial y obviamente no completo, pero creo que hace entender la idea.

+0

¡Gracias a todos! ¡Leeré sobre esto! –

+0

Solo quiero agregar que el valor 'this' dentro del método onClick se refiere a la instancia de Button, si desea hacer referencia a la instancia de Ejemplo dentro del método onClick puede usar 'Example.this'. Las clases internas estáticas no tienen esta referencia sin embargo. – Hoffmann

2

Lo que está sucediendo en su código es que está subclasificando implícitamente Apple con una clase interna anónima y anulando su método toString().

0

Se llama una clase interna anónima, puede leer sobre ella here y here.

Cuestiones relacionadas