Ich habe gelesen, dass Java-Interfaces nicht instanziiert werden können ( in der Dokumentation, Schnittstellen ). Runable, per Definition ist eine Schnittstelle, die von einer Klasse implementiert werden sollte. Aber im folgenden Stück Code von einer meiner Android-Anwendungen sehe ich, dass ein leerer Konstruktor - Runnable () ... (ich bin mir nicht sicher, ob es ein Konstruktor ist) verwendet wurde, und eine Instanz wurde erstellt - getStatus.
%Vor%Was ich erfahren habe:
Aber ich kann die Punkte nicht verbinden. Angenommen, dass der obige Code in der myActivity-Klasse enthalten ist, was wird instanziiert und wie ist diese anonyme Klasse?
Ein bisschen Detail wäre großartig.
Es wird eine "anonyme Klasse" genannt. Einige Anmerkungen dazu:
Sie haben es nicht mit einem Namen versehen, so dass einer für Sie erstellt wurde. Um zu sehen, wie es heißt, schreibe es einfach in die Konsole oder lies den Bytecode.
Die anonyme Klasse hat, wenn sie im Bereich der äußeren Klasse erstellt wird, einen Verweis auf ihre Felder, genau wie jede innere Klasse. Im Allgemeinen hat es den gleichen Umfang, in dem es erstellt wurde.
Es ist sehr normal, wenn Sie nur eine einfache Implementierung benötigen. Je mehr Code vorhanden ist, desto mehr sollten Sie in Erwägung ziehen, ihn in eine andere Datei zu schreiben (für die Reihenfolge, nicht weil Sie nicht können).
Runnable ist nicht die einzige Schnittstelle, die üblich ist. Unter Android verwenden Sie OnClickListener, OnTouchListener, ...
Da die anonyme Klasse den gleichen Gültigkeitsbereich wie die deklarierte hat, bedeutet das, dass sie eine Referenz hat. Versuchen Sie, eine anonyme Klasse niemals zu lange zu behalten (z. B. in einer statischen Referenz), da dies zu Speicherlecks führen könnte. Auf Android ist es sehr wichtig, wie dieses Beispiel zeigt (spricht über Drawables, aber ein anonymes Klasse kann auch einen Verweis auf einen Kontext haben).
Einige der Nachteile von anonymen Klassen bestehen darin, dass sie keinen Konstruktor haben und nicht mehr als eine Schnittstelle implementieren können. Es hat eine sehr enge Verwendung, aber es ist sehr beliebt, da es sehr einfach zu bedienen (und lesen) ist.
Google für weitere Informationen hierzu mit "Anonymous innerclass". Dieser "Innerer Unterricht in Java, das Mystery innerhalb" -Blogbeitrag erklärt recht gut die verschiedenen Arten von Innerem Klassen. Siehe auch "3.12. Anonyme Klassen" .
Was instanziiert wird, ist eine anonyme Unterklasse von Runnable
. Es heißt anonym, weil der Typ selbst keinen Namen hat. In dieser Unterklasse implementieren Sie die Methode run()
, die in der Schnittstelle Runnable
angegeben ist.
Der Typ von getStatus
ist Runnable
, das Objekt, auf das von getStatus
verwiesen wird, ist jedoch eine Implementierung von Runnable
, die keinen explizit benannten Typ hat.
Tags und Links java android multithreading instance anonymous-class