Heim Java javaLernprogramm Verwendung innerer Klassen und anonymer innerer Klassen

Verwendung innerer Klassen und anonymer innerer Klassen

Dec 15, 2016 pm 01:15 PM
anonyme innere Klasse

1. Innere Klassen:

(1) Methoden mit demselben Namen wie die innere Klasse

Innere Klassen können Methoden der äußeren Klasse aufrufen Derselbe Name, „OuterClass.this“, muss verwendet werden. Formataufruf „.MethodName()“ (wobei OuterClass und MethodName durch den tatsächlichen Namen der externen Klasse und ihre Methode ersetzt werden; dies ist das Schlüsselwort, das einen Verweis auf die externe Klasse angibt); Wenn die interne Klasse keine Methode mit demselben Namen hat, kann die Methode der externen Klasse direkt aufgerufen werden.
Aber periphere Klassen können private Methoden innerer Klassen nicht direkt aufrufen, und externe Klassen können private Methoden anderer Klassen nicht direkt aufrufen. Hinweis: Die Berechtigung der inneren Klasse, die äußere Klasse direkt zu verwenden, hat nichts damit zu tun, ob die Methode statisch ist. Sie hängt davon ab, ob die innere Klasse eine Methode mit demselben Namen hat.

package innerclass;
public class OuterClass {
    private void outerMethod() {
        System.out.println("It's Method of OuterClass");
    }
    public static void main(String[] args) {
        OuterClass t = new OuterClass();
        OuterClass.Innerclass in = t.new Innerclass();
        in.innerMethod();
    }
 
    class Innerclass {
        public void innerMethod() {
           OuterClass.this.outerMethod();// 内部类成员方法与外部类成员方法同名时,使用this调用外部类的方法
           outerMethod();// 内部类没有同名方法时执行外部类的方法
        }
        private void outerMethod() {
            System.out.println("It's Method of Innerclass");
        }
    }
}
Nach dem Login kopieren

Das Ausgabeergebnis ist:

It's Method of OuterClass
It's Method of Innerclass
Nach dem Login kopieren

(2) Instanziierung interner Klassen

Die Instanziierung interner Klassen unterscheidet sich von gewöhnlichen Klassen Wird überall verwendet. Bei Bedarf instanziieren. Die innere Klasse muss nach der Instanziierung der äußeren Klasse instanziiert werden und eine Beziehung zur äußeren Klasse herstellen.

Daher ist in der nicht statischen Methode die äußere Klasse die innere Klasse kann instanziiert werden Objekt

private void outerMethod() {
    System.out.println("It's Method of OuterClass");
    Innerclass in = new Innerclass();//在外部类的outerMethod方法中实例化内部类是可以啊
}
Nach dem Login kopieren

Aber bei der statischen Methode sollten Sie aufpassen! ! ! ! Sie können die innere Klasse nicht direkt in der statischen Methode neu erstellen, da sonst ein Fehler auftritt:

Keine umschließende Instanz vom Typ OuterClass ist zugänglich. Die Zuordnung muss mit einer umschließenden Instanz vom Typ OuterClass qualifiziert werden (z. B. x.new A() where Egal wie Sie es verwenden, Sie können nichts aufrufen, was nicht existiert.

Wenn Sie eine neue innere Klasse in der statischen Methode erstellen möchten, können Sie die innere Klasse als statisch deklarieren

Natürlich wird die statische Methode im Allgemeinen nicht verwendet, aber dies ist der Fall Methode wird empfohlen: x.new A() , wobei x eine Instanz der äußeren Klasse OuterClass ist, A die innere Klasse Innerclass
public class OuterClass {
    private void outerMethod() {
        System.out.println("It's Method of OuterClass");
    }
 
    public static void main(String[] args) {
        Innerclass in = new Innerclass();
        in.innerMethod();
    }
 
    static class Innerclass {//把内部类声明为static
        public void innerMethod() {
            System.out.println("It's Method of innerMethod");
 
        }
    }
 
}
Nach dem Login kopieren

x.new A() , wobei x eine Instanz von ist Die äußere Klasse OuterClass, A ist die Klasse class Innerclass, kann natürlich wie folgt aufgeteilt werden, daher ist es offensichtlich klar:
package innerclass;
public class OuterClass {
    private void outerMethod() {
        System.out.println("It's Method of OuterClass");
    }
    public static void main(String[] args) {
        OuterClass.Innerclass in = new OuterClass().new Innerclass();//使用x.new A()的方式
        in.innerMethod();
    }
    class Innerclass {
        public void innerMethod() {
            System.out.println("It's Method of innerMethod");
        }
    }
}
Nach dem Login kopieren

(3) Wann interne Klassen verwendet werden sollen
public static void main(String[] args) {
    OuterClass out = new OuterClass();//外部实例
    OuterClass.Innerclass in = out.new Innerclass();//外部实例.new 外部类
    in.innerMethod();
}
Nach dem Login kopieren
Eine typische Situation ist, dass eine interne Klasse von einer bestimmten Klasse erbt oder eine bestimmte Klasse implementiert. Bei einer Schnittstelle arbeitet der Code der inneren Klasse mit dem Objekt der äußeren Klasse, die es erstellt. Man kann sich innere Klassen also als eine Art Fenster zu ihren äußeren Klassen vorstellen.

Der attraktivste Grund für die Verwendung innerer Klassen besteht darin, dass jede innere Klasse unabhängig von einer Implementierung (einer Schnittstelle) erben kann. Daher hat die Frage, ob die äußere Klasse eine Implementierung einer (Schnittstelle)
geerbt hat, keinen Einfluss darauf innere Klassen. Ohne die Fähigkeit innerer Klassen, von mehreren konkreten oder abstrakten Klassen zu erben, wären einige Design- und Programmierprobleme schwer zu lösen. Aus dieser Perspektive vervollständigen innere Klassen die Mehrfachvererbungslösung. Schnittstellen lösen einen Teil des Problems, während innere Klassen die „Mehrfachvererbung“ effektiv implementieren.

(4) Beispiel für die Instanziierung einer inneren Klasse in einer statischen Methode: (Die innere Klasse wird in einer statischen Methode platziert)

per.speak() ist aufrufbar und per .say( ) kann zu diesem Zeitpunkt nicht aufgerufen werden, da per ein Person-Objekt ist. Wenn Sie die Methode der Unterklasse aufrufen möchten, können Sie den Downcast erzwingen: ((Boy) per).say(); ändere es in Boy per = new Boy(); Es kann festgestellt werden, dass Sie, wenn Sie eine benutzerdefinierte Methode einer inneren Klasse aufrufen möchten, diese über das Objekt der inneren Klasse aufrufen müssen. Wenn also die anonyme innere Klasse nicht einmal einen Namen hat, wie ruft man dann die benutzerdefinierte Methode der inneren Klasse auf?

package javatest2;
public class JavaTest2 {
    public static void main(String[] args) {
        class Boy implements Person {
            public void say() {// 匿名内部类自定义的方法say
                System.out.println("say方法调用");
            }
            @Override
            public void speak() {// 实现接口的的方法speak
                System.out.println("speak方法调用");
            }
        }
        Person per = new Boy();
        per.speak();// 可调用
        per.say();// 不能调用
    }
}
interface Person {
    public void speak();
}
Nach dem Login kopieren

(2) Anonyme innere Klassen

Anonyme innere Klassen sind auch innere Klassen ohne Namen, daher können anonyme innere Klassen nur einmal verwendet werden Normalerweise wird es verwendet, um das Schreiben von Code zu vereinfachen. Für die Verwendung anonymer innerer Klassen gibt es jedoch eine Voraussetzung: Sie müssen eine übergeordnete Klasse erben oder eine Schnittstelle implementieren, Sie können jedoch höchstens eine übergeordnete Klasse erben oder eine Schnittstelle implementieren.

Es gibt zwei weitere 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 nicht unbedingt Konstruktoren (Konstruktoren). Da anonyme innere Klassen keinen Klassennamen haben, können sie keinen Konstruktor definieren, aber anonyme innere Klassen können Instanzinitialisierungsblöcke definieren Wie beurteilt man? Gibt es eine anonyme Klasse? 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


Im Allgemeinen sollte bei einem neuen Objekt nach den Klammern ein Semikolon stehen, d. h. die Anweisung, dass das Objekt neu ist, endet. Anders verhält es sich jedoch, wenn anonyme innere Klassen vorhanden sind. 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. Es muss eine Implementierungsklasse geben, bevor wir ihre Implementierungsklasse neu erstellen können. Der obige Pseudocode zeigt an, dass new die Implementierungsklasse von Father ist und diese Implementierungsklasse eine anonyme innere Klasse ist.

Tatsächlich kann die obige anonyme innere Klasse wie folgt aufgeteilt werden:


Schauen wir uns zunächst ein Beispiel an, um die Verwendung anonymer innerer Klassen zu erleben:
abstract class Father(){
....
}
public class Test{
   Father f1 = new Father(){ .... }  //这里就是有个匿名内部类
}
Nach dem Login kopieren


运行结果:eat something
可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写。并且,匿名内部类还能用于接口上

public class JavaTest2 {
    public static void main(String[] args) {
        Person per = new Person() {
            public void say() {// 匿名内部类自定义的方法say
                System.out.println("say方法调用");
            }
            @Override
            public void speak() {// 实现接口的的方法speak
                System.out.println("speak方法调用");
            }
        };
        per.speak();// 可调用
        per.say();// 出错,不能调用
    }
}
 
interface Person {
    public void speak();
}
Nach dem Login kopieren

这里per.speak()是可以正常调用的,但per.say()不能调用,为什么呢?注意Person per = new Person()创建的是Person的对象,而非匿名内部类的对象。其实匿名内部类连名字都没有,你咋实例对象去调用它的方法呢?但继承父类的方法和实现的方法是可以正常调用的,本例子中,匿名内部类实现了接口Person的speak方法,因此可以借助Person的对象去调用。

若你确实想调用匿名内部类的自定义的方法say(),当然也有方法:

(1)类似于speak方法的使用,先在Person接口中声明say()方法,再在匿名内部类中覆写此方法。

(2)其实匿名内部类中隐含一个匿名对象,通过该方法可以直接调用say()和speak()方法;代码修改如下:

public class JavaTest2 {
    public static void main(String[] args) {
        new Person() {
            public void say() {// 匿名内部类自定义的方法say
                System.out.println("say方法调用");
            }
 
            @Override
            public void speak() {// 实现接口的的方法speak
                System.out.println("speak方法调用");
            }
        }.say();// 直接调用匿名内部类的方法
    }
}
interface Person {
    public void speak();
}
Nach dem Login kopieren


更多内部类和匿名内部类的用法相关文章请关注PHP中文网!

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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

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.

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 ist der Lebenszyklus anonymer innerer Java-Klassen? Was ist der Lebenszyklus anonymer innerer Java-Klassen? May 01, 2024 pm 04:06 PM

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.

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

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.

Was ist die Alternative zu anonymen inneren Klassen in Java? Was ist die Alternative zu anonymen inneren Klassen in Java? Apr 30, 2024 pm 01:15 PM

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.

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

See all articles