Anonyme innere Klassen im Detail
Anonyme innere Klassen eignen sich zum Erstellen von Klassen, die nur einmal verwendet werden müssen, z. B. das im Befehlsmodus erforderliche Command-Objekt. Die Syntax anonymer innerer Klassen ist etwas seltsam. Wenn eine anonyme innere Klasse erstellt wird, wird sofort eine Instanz der Klasse erstellt und die anonyme innere Klasse kann nicht wiederverwendet werden.
Das Format zum Definieren anonymer innerer Klassen lautet wie folgt:
new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }
Wie aus der obigen Definition ersichtlich ist, müssen anonyme innere Klassen eine übergeordnete Klasse erben oder eine Schnittstelle implementieren, sie können jedoch nur erben höchstens eine übergeordnete Klasse. Oder eine Schnittstelle implementieren.
Es gibt zwei Regeln für anonyme innere Klassen:
1) Anonyme innere Klassen können keine abstrakten Klassen sein, denn wenn das System eine anonyme innere Klasse erstellt, erstellt es sofort ein Objekt der inneren Klasse. Daher dürfen anonyme innere Klassen
nicht als abstrakte Klassen definiert werden.
2) Anonyme innere Klassen definieren keine Konstruktoren, aber anonyme innere Klassen können Instanzinitialisierungsblöcke definieren.
Erfüllen Sie die Konstruktoranforderungen durch Instanzinitialisierungsblöcke Erledigt.
Die häufigste Methode zum Erstellen einer anonymen inneren Klasse besteht darin, ein Objekt eines Schnittstellentyps zu erstellen, wie im folgenden Programm gezeigt:
interface Product{ public double getPrice(); public String getName(); } public class TestAnonymous{ public void test(Product p){ System.out.println("购买了一个"+p.getName()+",花掉 了"+p.getPrice()); } public static void main(String[]args){ TestAnonymous ta = new TestAnonymous(); ta.test(new Product(){ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } }); } }
Die TestAnonymous-Klasse im obigen Programm definiert eine Testmethode , das ein Produktobjekt als Parameter benötigt, aber Produkt ist nur eine Schnittstelle,
kann kein Objekt direkt erstellen. Erwägen Sie daher, ein Objekt der Produktschnittstellen-Implementierungsklasse zu erstellen und es an diese Methode zu übergeben --- wenn dieses Produkt Die Schnittstellenimplementierungsklasse muss wiederholt werden
Zur Verwendung sollten Sie eine unabhängige Klasse über die Implementierungsklasse definieren. Wenn die Produktschnittstellenimplementierungsklasse nur einmal verwendet werden muss, können Sie die Methode im obigen Programm verwenden, um <🎜 zu definieren > eine anonyme innere Klasse.
Wie Sie im obigen Programm sehen können, ist das Schlüsselwort class nicht erforderlich, um eine anonyme Klasse zu definieren. Stattdessen wird beim Definieren einer anonymen inneren Klasse das Objekt der anonymen inneren Klasse direkt generiert. Der oben fett gedruckte Codeteil
ist der Klassenkörperteil der anonymen Klasse.
Da anonyme innere Klassen keine abstrakten Klassen sein können, müssen anonyme innere Klassen alle abstrakten Methoden implementieren, die in ihrer abstrakten übergeordneten Klasse oder Schnittstelle enthalten sind.
Der obige Code zum Erstellen von Produktimplementierungsklassenobjekten kann in den folgenden Code aufgeteilt werden:
class AnonymousProduct implements Product{ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } } ta.test(new AnonymousProduct());
, sodass Parameterwerte nicht in Klammern nach dem neuen Schnittstellennamen übergeben werden können.
Wenn Sie jedoch eine anonyme innere Klasse erstellen, indem Sie die übergeordnete Klasse erben, verfügt die anonyme innere Klasse über einen ähnlichen Konstruktor wie die übergeordnete Klasse. Die Ähnlichkeit bezieht sich hier auf die gleiche Liste formaler Parameter
.
abstract class Device{ private String name; public Device(){ } public Device(String name){ this.name = name; } public abstract double getPrice(); //此处省略了name属性的setter和getter方法 } public class AnonymousInner{ public void test(Device d){ System.out.println("购买了一个"+d.getName()+",花掉了"+d.getPrice()); } public static void main(String[] args){ AnonymousInner ai = new AnonymousInner(); //调用有参数的构造器创建Device匿名实现类的对象 ai.test(new Device("电子示波器"){ public double getPrice(){ return 67; } }); //调用无参数的构造器创建Device匿名实现类的对象 Device d = new Device(){ //初始化块 { System.out.println("匿名内部类的初始化块..."); } //实现抽象方法 public double getPrice(){ return 56; } public Sting getName(){ return "键盘"; } }; ai.test(d); } }
als übergeordneter Klasse erstellen, können Sie Parameter übergeben (z. B. den fett gedruckten Teil im ersten Absatz des obigen Programms) oder keine Parameter übergeben (z. B. den zweiten fett gedruckten Teil). Teil im obigen Programm).
Beim Erstellen einer anonymen inneren Klasse müssen Sie alle abstrakten Methoden in der Schnittstelle oder der abstrakten übergeordneten Klasse implementieren. Bei Bedarf können Sie auch die gewöhnlichen Methoden in der übergeordneten Klasse überschreiben. Im zweiten fett gedruckten Codeteil des
-Programms oben überschreibt die anonyme innere Klasse beispielsweise die getName-Methode der abstrakten übergeordneten Klasse Device-Klasse Die getName-Methode ist keine abstrakte Methode.
Wenn die anonyme innere Klasse auf die lokalen Variablen der äußeren Klasse zugreifen muss, muss sie den endgültigen Modifikator verwenden, um die lokalen Variablen der äußeren Klasse zu ändern.
Andernfalls meldet das System einen Fehler.
interface A{ void test(); } public class TestA{ public static void main(Strign[] args){ int age = 0; A a = new A(){ public void test(){ //下面语句将提示错误:匿名内部类内访问局部变量必须使用final修饰 System.out.println(age); } }; } }
Weitere Artikel zu anonymen internen Klassen finden Sie auf der chinesischen PHP-Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Anonyme innere Klassen können Speicherlecks verursachen. Das Problem besteht darin, dass sie einen Verweis auf die äußere Klasse enthalten und so verhindern, dass die äußere Klasse durch Müll gesammelt wird. Zu den Lösungen gehören: 1. Verwenden Sie schwache Referenzen, wenn die externe Klasse nicht mehr von einer starken Referenz gehalten wird. 2. Verwenden Sie weiche Referenzen Benötigt Speicher während der Garbage Collection. Nur dann wird das Soft-Referenzobjekt recycelt. Im tatsächlichen Kampf, beispielsweise in Android-Anwendungen, kann das durch anonyme innere Klassen verursachte Speicherleckproblem durch die Verwendung schwacher Referenzen gelöst werden, sodass die anonyme innere Klasse recycelt werden kann, wenn der Listener nicht benötigt wird.

Anonyme innere Klassen sind spezielle innere Klassen in Java, die keinen expliziten Namen haben und durch den neuen Ausdruck erstellt werden. Sie werden hauptsächlich zum Implementieren bestimmter Schnittstellen oder zum Erweitern abstrakter Klassen verwendet und unmittelbar nach der Erstellung verwendet. Zu den gängigen Entwurfsmustern für anonyme innere Klassen gehören: Adaptermuster: Konvertiert eine Schnittstelle in eine andere Schnittstelle. Strategiemuster: Algorithmen definieren und ersetzen. Beobachtermuster: Beobachter registrieren und Ereignisse verarbeiten. Dies ist in praktischen Anwendungen sehr nützlich, z. B. beim Sortieren eines TreeSet nach Zeichenfolgenlänge, beim Erstellen anonymer Threads usw.

Anonyme innere Klassen werden in Java als spezielle innere Klassen verwendet, die die Unterklassenbildung, die Vereinfachung von Code und die Verarbeitung von Ereignissen (z. B. Schaltflächenklicks) erleichtern. Zu den praktischen Fällen gehören: Ereignisbehandlung: Verwenden Sie anonyme innere Klassen, um Klickereignis-Listener für Schaltflächen hinzuzufügen. Datentransformation: Sortieren Sie Sammlungen mithilfe der Collections.sort-Methode und einer anonymen inneren Klasse als Komparator.

Die Lebensdauer einer anonymen inneren Klasse wird durch ihren Geltungsbereich bestimmt: Methodenlokale innere Klasse: Nur innerhalb des Geltungsbereichs der Methode gültig, die sie erstellt hat. Konstruktor der inneren Klasse: An die Instanz der äußeren Klasse gebunden und freigegeben, wenn die Instanz der äußeren Klasse freigegeben wird. Statische innere Klassen: werden gleichzeitig mit externen Klassen geladen und entladen.

Fehler bei der Verwendung anonymer innerer Klassen: Zugriff auf eine Variable außerhalb des Gültigkeitsbereichs durch Abfangen einer nicht deklarierten Ausnahme in einer nicht threadsicheren Umgebung

Das Leistungsproblem anonymer innerer Klassen besteht darin, dass sie bei jeder Verwendung neu erstellt werden. Dies kann durch die folgenden Strategien optimiert werden: 1. Anonyme innere Klassen in lokalen Variablen speichern. 2. Nicht statische innere Klassen verwenden Ausdrücke. Praxistests zeigen, dass die Optimierung des Lambda-Ausdrucks die beste Wirkung erzielt.

Lambda-Ausdrücke bieten als Alternative zu anonymen inneren Klassen eine prägnantere Möglichkeit, die Implementierung funktionaler Schnittstellen zu definieren: Verwenden Sie die kurze Syntax (Parameter)->Ausdruck, um anonyme Funktionen zu definieren. Geeignet für Situationen, in denen funktionale Schnittstellen implementiert werden müssen (nur eine abstrakte Methode). Kann Aufgaben wie Listensortierung und Thread-Definition vereinfachen.

Anonyme innere Klassen vereinfachen die Erstellung von Multithread-Code, machen eine Benennung überflüssig und ermöglichen die sofortige Definition und Verwendung von Thread-Klassen. Der Hauptvorteil besteht in der Vereinfachung des Codes, die Einschränkung besteht jedoch darin, dass er nicht erweitert werden kann. Verwenden Sie diese Option, wenn Sie schnell einen oder zwei Threads erstellen müssen. Halten Sie den Code kurz. Wenn eine komplexere Logik erforderlich ist, sollte eine separate Klassendatei erstellt werden.
