2012-01-18 16 views
10

Ho visto un paio di esempi simili a questo in Java e spero che qualcuno possa spiegare cosa sta succedendo. Sembra che una nuova classe possa essere definita in linea, il che mi sembra davvero strano. È prevista la prima riga di stampa, poiché è semplicemente la toString. Tuttavia il secondo sembra che la funzione possa essere sovrascritta in linea. Esiste un termine tecnico per questo? O qualsiasi documentazione che approfondisce? Grazie!Java - definizione classe inline

Se ho il seguente codice:

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"; 
       } 
      } 
     ); 
    } 
} 

Le uscite di codice:

first: original apple 
second: modified apple 

risposta

15

Si tratta di una classe interna anonima. È possibile trovare ulteriori informazioni a riguardo al collegamento della documentazione Java per Inner Classes. EDIT Aggiungo un better link che descrive classi interne anonime, poiché la documentazione Java lascia a desiderare. /EDIT

La maggior parte delle persone usa Anonimo classi interne per definire gli ascoltatori al volo. Considerare questo scenario:

Ho uno Button e quando lo clicco, voglio che mostri qualcosa sulla console. Ma non voglio dover creare una nuova classe in un file diverso, e non voglio dover definire una classe interna più avanti in questo file, voglio che la logica sia immediatamente disponibile qui.

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); 
    } 
} 

L'esempio è un po 'artificioso e ovviamente non completo, ma penso che dia l'idea.

+0

Grazie a tutti! Andrò a leggere su questo! –

+0

Voglio solo aggiungere che il valore "this" nel metodo onClick fa riferimento all'istanza Button, se si desidera fare riferimento all'istanza di Esempio all'interno del metodo onClick, è possibile utilizzare "Example.this". Le classi interne statiche però non hanno questo riferimento. – Hoffmann

2

Quello che sta accadendo nel tuo codice è che stai implicitamente sottoclassi Apple con una classe interna anonima e sovrascrivendo il suo metodo toString().

0

Si chiama classe interna anonima, si può leggere su di esso here e here.

Problemi correlati