2009-10-09 10 views
32

Ich bin relativ neu in Java und ich verwende eine neue API. Ich kam in diese Methode überschreiben, und ich bin nicht sicher, was das heißt:Wie wird diese Art von Methode in Java aufgerufen?

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

Von dem, was ich verstehe, das die onSubmit Methode der Button-Klasse überschreibt. Ich bin noch nie auf solche Übertreibungen gestoßen. Gibt es einen bestimmten Namen dafür? Ich möchte mehr darüber lesen, aber ich kann es nicht finden. Alle meine bisherigen Suchen führen dazu, dass die normale Methode überschrieben wird, indem ich eine neue Klasse erstelle, mit der ich bereits vertraut bin.

Ich würde mich freuen, wenn mir jemand in die richtige Richtung zeigen könnte.

Danke.

+3

Große Frage ... und es ist die Art von Sache, die sehr schwierig ist, in einer Referenz nachzusehen! +1 Glücklicherweise, als ich versuchte, das gleiche Q auf SO zu stellen, fand es dein Q für mich. – LarsH

Antwort

28

Das ist eine anonymous inner class ist.

Im obigen Beispiel erstellen wir anstelle einer private class, die Button erweitert, eine Unterklasse von Button und stellen die Implementierung der überschriebenen Methode im Einklang mit dem Rest des Codes bereit.

Da diese neue Klasse im laufenden Betrieb erstellt wird, hat sie keinen Namen, daher anonymous. Wie es in einer anderen Klasse definiert ist, ist es eine anonyme innere Klasse.

Es kann eine sehr praktische Abkürzung sein, vor allem für Listener Klassen, aber es kann Ihren Code schwer zu folgen, wenn Sie weggetragen werden und die in-line-Methode Definitionen zu lang werden.

12

Das ist ein anonymous inner class. Im Grunde erstellt es eine neue Klasse, die von der angegebenen abgeleitet ist (Button in diesem Fall, obwohl Sie die gleiche Technik verwenden können, um Schnittstellen zu implementieren) und überschreibt geeignete Methoden. Es kann auch andere Methoden enthalten, die jedoch nur innerhalb dieser Klasse verfügbar sind.

Die Klasse hat Zugriff auf die letzten lokalen Variablen innerhalb der gleichen Methode. Wenn Sie eine Instanzmethode schreiben, hat sie auch eine implizite Referenz auf this (Sie können also andere Methoden in Ihrer "main" -Klasse aufrufen).

+0

Danke. Ich suchte nach innerer Methode, aber ich dachte nicht an eine innere Klasse, geschweige denn an eine anonyme innere Klasse. Ab, um über sie zu lesen, gehe ich! –