Heim Java javaLernprogramm Kurze Analyse anonymer innerer Java-Instanzen

Kurze Analyse anonymer innerer Java-Instanzen

Dec 15, 2016 pm 12:55 PM
anonyme innere Klasse

Anonyme Klassen sind Klassen, die keine Namen haben können und daher nicht referenziert werden können. Sie müssen zum Zeitpunkt der Erstellung als Teil der neuen Anweisung deklariert werden. Dies erfordert die Verwendung einer anderen Form einer neuen Anweisung, wie unten gezeigt: new Diese Form einer neuen Anweisung deklariert eine neue anonyme Klasse, die eine A-Klasse erweitert oder eine bestimmte Schnittstelle implementiert. Außerdem wird eine neue Instanz dieser Klasse erstellt und als Ergebnis der Anweisung zurückgegeben. Die zu erweiternde Klasse und die zu implementierende Schnittstelle sind die Operanden der neuen Anweisung, gefolgt vom Rumpf der anonymen Klasse. Wenn eine anonyme Klasse eine andere Klasse erweitert, kann ihr Rumpf auf die Mitglieder der Klasse zugreifen, ihre Methoden überschreiben usw., genau wie jede andere Standardklasse. Wenn eine anonyme Klasse eine Schnittstelle implementiert, muss ihr Körper die Methoden der Schnittstelle implementieren.
Java-Code

interface pr 
{ 
void print1(); 
} 
public class noNameClass 
{ 
public pr dest() 
{ 
return new pr(){ 
public void print1() 
{ 
System.out.println("Hello world!!"); 
} 
}; 
} 
public static void main(String args[]) 
{ 
noNameClass c = new noNameClass(); 
pr hw=c.dest(); 
hw.print1(); 
} 
}
Nach dem Login kopieren

pr kann auch eine Klasse sein, aber die Methode, die Sie extern aufrufen, muss in Ihrer Klasse oder Schnittstelle deklariert werden. Methoden innerhalb anonymer Klassen können nicht von außen aufgerufen werden In Java Der vielleicht am häufigsten verwendete Ort für anonyme Klassen ist das Hinzufügen von Listner zu Frame.
Wie folgt:
Java-Code

import java.awt.*; 
import java.awt.event.*; 
public class QFrame extends Frame { 
public QFrame() { 
this.setTitle(\"my application\"); 
addWindowListener(new WindowAdapter() { 
public void windowClosing(WindowEvent e) { 
dispose(); 
System.exit(0); 
} 
}); 
this.setBounds(10,10,200,200); 
} 
}
Nach dem Login kopieren
Die interne anonyme Klasse erstellt eine interne Klasse, gibt Ihnen jedoch keinen Namen, dh es gibt keine Variable, die auf die Instanz verweist.

new WindowAdapter() { 
public void windowClosing(WindowEvent e) { 
dispose(); 
System.exit(0); 
} 
}
Nach dem Login kopieren
Neu ist die Erstellung eines WindowAdapter-Objekts. Das folgende {} gibt an, dass die Operation in den Klammern auf dieses Standardobjekt wirkt und dem obigen Java-Programm ein Funktionskörper folgt.

Der Zweck dieser Verwendung besteht darin, eine Instanz eines Objekts zu erstellen und eine seiner Funktionen zu überschreiben. Sie finden es, indem Sie den WindowAdapter-Code öffnen. Es ist eine abstrakte Klasse. Es handelt sich um eine Implementierung der WindowListener-Schnittstelle. Der Parameter von Frame.addWindowListner(); ist ein WindowListner, und die Implementierung besteht darin, eine von WindowAdapter abgeleitete anonyme Klasse zu übergeben.
1. Wie kann man die Existenz einer anonymen Klasse feststellen? Ich kann den Namen nicht sehen, es fühlt sich an, als wäre es nur ein Objekt, das von new aus der übergeordneten Klasse erstellt wurde, und es gibt keinen Namen für die anonyme Klasse.
Schauen wir uns zuerst den Pseudocode an

abstract class Father(){ 
.... 
} 
public class Test{ 
Father f1 = new Father(){ .... } //这里就是有个匿名内部类 
}
Nach dem Login kopieren
Im Allgemeinen sollte bei einem neuen Objekt nach den Klammern ein Semikolon stehen, d. h. die Anweisung des neuen Objekts endet.

Aber es ist anders, wenn eine anonyme innere Klasse erscheint. Den Klammern folgen geschweifte Klammern, und die geschweiften Klammern enthalten die spezifische Implementierungsmethode des neuen Objekts.
Weil wir wissen, dass eine abstrakte Klasse nicht direkt neu sein kann, müssen wir zuerst eine Implementierungsklasse haben, bevor wir ihre Implementierungsklasse neu erstellen können.
Der obige Pseudocode bedeutet, dass new die Implementierungsklasse von Father ist. Diese Implementierungsklasse ist eine anonyme innere Klasse.
Tatsächlich kann die obige anonyme innere Klasse aufgeteilt werden als

class SonOne extends Father{ 
...//这里的代码和上面匿名内部类,大括号中的代码是一样的 
} 
public class Test{ 
Father f1 = new SonOne() ; 
}
Nach dem Login kopieren
2. Hinweise zu anonymen inneren Klassen

Beachten Sie, dass die Deklaration der anonymen Klasse zur Kompilierungszeit erfolgt und die Die Instanziierung erfolgt zur Laufzeit. Das bedeutet, dass eine neue Anweisung in einer for-Schleife mehrere Instanzen derselben anonymen Klasse erstellt, anstatt eine Instanz mehrerer verschiedener anonymer Klassen.
Beachten Sie bei der Verwendung anonymer innerer Klassen die folgenden Grundsätze:
·Anonyme innere Klassen können keine Konstruktoren haben.
·Anonyme innere Klassen können keine statischen Mitglieder, Methoden und Klassen definieren.
·Anonyme innere Klassen können nicht öffentlich, geschützt, privat oder statisch sein.
·Es kann nur eine Instanz einer anonymen inneren Klasse erstellt werden.
·Eine anonyme innere Klasse muss hinter new stehen und wird verwendet, um implizit eine Schnittstelle oder eine Klasse zu implementieren.
·Da anonyme innere Klassen lokale innere Klassen sind, gelten alle Einschränkungen für lokale innere Klassen für sie.
·Innere Klassen können nur auf statische Variablen oder statische Methoden äußerer Klassen zugreifen.
Dies gilt für anonyme Klassen und innere Klassen:
Manchmal verwenden wir einige innere Klassen und anonyme Klassen. Wenn dies in einer anonymen Klasse verwendet wird, bezieht sich dies auf die anonyme Klasse oder innere Klasse selbst. Wenn wir zu diesem Zeitpunkt die Methoden und Variablen der externen Klasse verwenden möchten, sollten wir den Klassennamen der externen Klasse hinzufügen
3. Die Rolle anonymer innerer Klassen
Die internen Klassen von Java sind im Wesentlichen dieselben Verschachtelte Klassen in C++ Unterschied: Verschachtelte Klassen in C++ haben keine Handles für Wrapper-Klassen. Es drückt nur das Konzept der Kapselung aus, aber die innere Klasse von Java ist anders, sie kann auf die Mitglieder der Wrapping-Klasse zugreifen (was bedeutet, dass sie ein Handle für die Wrapping-Klasse hat).
Anonyme innere Klassen sind eine vereinfachte Art, innere Klassen zu schreiben: return new Wrapper {
...
} ist äquivalent zu: Wrapped erweitert Wrapper {
...
}
return new Wrapped();
Ist dies die einzige Rolle anonymer innerer Klassen?
Betrachten Sie diesen Fall:

Es gibt eine Klasse Child, die nicht nur die count()-Methode von Parent erben möchte, sondern auch die count-Methode in der ICount-Schnittstelle implementieren möchte sollten wir das zu diesem Zeitpunkt tun? Innere Klassen können ins Spiel kommen:
interface ICount { 
int count(); 
} 
class Parent { 
int i = 0; 
int count() { 
return i++; 
} 
}
Nach dem Login kopieren

Sehen Sie sich diesen Code an
class Child extends Parent { 
ICount getCount() { 
return new ICount { 
int i = 0; 
int count() { 
return (i *= 2); 
} 
} 
} 
}
Nach dem Login kopieren

public static void main(String[] args) { 
theApp = new Analyzer(); 
SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class 
// object 
public void run() { // Run method executed in thread 
theApp.creatGUI(); // Call static GUI creator 
} 
}); 
} 
public static void main(String[] args) { 
theApp = new Analyzer(); // 创建一个对象 
SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class 
// 一个匿名内部类,他实现了一个线程 
// 原本这个方法是传一个Runnable类型参数 // 这里可以通过这种匿名类的方式来实现 
// object 
public void run() { // Run method executed in thread 
theApp.creatGUI(); // Call static GUI creator 
} 
}); 
}
Nach dem Login kopieren



Mehr Java für Verwandte Artikel zur kurzen Analyse anonymer innerer Klasseninstanzen. Bitte beachten Sie die chinesische PHP-Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1659
14
PHP-Tutorial
1259
29
C#-Tutorial
1233
24
Wie löst die anonyme innere Java-Klasse das Problem des Speicherverlusts? Wie löst die anonyme innere Java-Klasse das Problem des Speicherverlusts? May 01, 2024 pm 10:30 PM

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.

Was sind die Entwurfsmuster für anonyme innere Klassen in Java? Was sind die Entwurfsmuster für anonyme innere Klassen in Java? May 02, 2024 pm 04:42 PM

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.

In welchen Szenarien sind anonyme innere Java-Klassen nicht für den Einsatz geeignet? In welchen Szenarien sind anonyme innere Java-Klassen nicht für den Einsatz geeignet? May 03, 2024 pm 05:42 PM

Anonyme innere Klassen eignen sich nicht für den Einsatz, wenn auf private Mitglieder zugegriffen werden muss, mehrere Instanzen erforderlich sind, Vererbung erforderlich ist oder auf generische Typen zugegriffen werden muss

Was sind die Vorteile anonymer innerer Klassen in Java? Was sind die Vorteile anonymer innerer Klassen in Java? Apr 30, 2024 am 11:39 AM

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.

Was sind die häufigsten Fehler bei anonymen inneren Klassen in Java? Was sind die häufigsten Fehler bei anonymen inneren Klassen in Java? May 02, 2024 am 09:03 AM

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

Welche Einschränkungen gibt es bei anonymen inneren Java-Klassen? Welche Einschränkungen gibt es bei anonymen inneren Java-Klassen? May 01, 2024 pm 02:18 PM

Zu den Einschränkungen anonymer innerer Klassen gehören: Unfähigkeit, auf externe lokale Variablen zuzugreifen; Unfähigkeit, überprüfte Ausnahmen auszulösen;

Wie kann die Leistung anonymer innerer Java-Klassen optimiert werden? Wie kann die Leistung anonymer innerer Java-Klassen optimiert werden? May 02, 2024 am 08:48 AM

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.

Wie werden anonyme innere Java-Klassen auf Threads angewendet? Wie werden anonyme innere Java-Klassen auf Threads angewendet? May 02, 2024 pm 01:57 PM

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.

See all articles