2009-10-09 6 views
32

Sono relativamente nuovo in Java e sto utilizzando una nuova API. Mi sono imbattuto in questo metodo override e non sono sicuro di ciò che questo si chiama:Che cos'è questo metodo di sovrascrittura del metodo chiamato in Java?

public void exampleMethod() { 
    Button loginButton = new Button("login"){ 
     public void onSubmit(){ 
      //submit code here 
     } 
    }; 
} 

Da quello che ho capito, questo è l'override del metodo onSubmit della classe Button. Non ho mai incontrato prima questo tipo di override. C'è un nome specifico per questo? Voglio saperne di più, ma non riesco a trovarlo. Tutte le mie ricerche finora hanno superato il normale metodo creando una nuova classe, che è ciò che conosco già.

Apprezzerei se qualcuno potesse indicarmi la giusta direzione.

Grazie.

+3

Ottima domanda ... ed è il tipo di cosa che è molto difficile da consultare in un riferimento! +1 Per fortuna, mentre tentavo di chiedere la stessa Q su SO, ho trovato la tua Q per me. – LarsH

risposta

28

Questo è un anonymous inner class.

Nell'esempio sopra invece di creare un private class che si estende Button creiamo una sottoclasse di Button e forniamo l'implementazione del metodo sottoposto a override in linea con il resto del codice.

Come questa nuova classe viene creata al volo non ha nome, quindi anonimo. Come definito in un'altra classe, è una classe anonima interna.

Può essere una scorciatoia molto maneggevole, in particolare per le classi Listener, ma può rendere difficile la lettura del codice se ci si allontana e le definizioni del metodo in linea diventano troppo lunghe.

12

Questo è un anonymous inner class. Fondamentalmente crea una nuova classe che deriva da quella specificata (Button in questo caso, sebbene sia possibile utilizzare la stessa tecnica per implementare le interfacce) e sovrascriva i metodi appropriati. Può contenere anche altri metodi, ma sarebbero disponibili solo all'interno di quella classe.

La classe ha accesso alle variabili locali finali all'interno dello stesso metodo e se si sta scrivendo un metodo di istanza ha anche un riferimento implicito a this (quindi è possibile chiamare altri metodi nella classe "principale").

+0

Grazie. Ho cercato il metodo interiore, ma non l'ho pensato come una classe interiore, tanto meno una classe interiore anonima. Off a leggere su di loro vado! –