Anonyme innere Klasse in Java

Shikha Chaudhary 12 Oktober 2023
  1. Anonyme innere Klasse in Java
  2. Variablen und Mitglieder der anonymen inneren Klasse in Java
  3. Erstellung anonymer innerer Klassen in Java
  4. Verschiedene Arten anonymer innerer Klassen in Java
  5. Vorteile der anonymen inneren Klasse in Java
  6. Fazit
Anonyme innere Klasse in Java

Dieser Artikel spricht über die Klasse Anonymous Inner in Java und ihre Nützlichkeit.

Anonyme innere Klasse in Java

Das Wort anonym bedeutet - von unbekanntem Namen. Dasselbe gilt für die anonyme innere Java-Klasse.

Eine innere Klasse ohne Namen, für die wir nur ein einziges Objekt erstellen müssen, wird als anonyme innere Java-Klasse bezeichnet. Es ist nützlich, wenn wir eine Instanz des Objekts erstellen müssen, wenn wir einige zusätzliche Dinge tun müssen, wie das Überladen von Methoden aus einer Klasse oder einer Schnittstelle.

Wir können dies tun, indem wir die anonyme innere Java-Klasse verwenden, ohne die Unterklasse der Klasse zu erstellen.

Mit anderen Worten, eine Klasse ohne Namen wird als anonyme innere Java-Klasse bezeichnet. Wenn wir eine neue Klasse erstellen, hat sie normalerweise einen Namen.

Daher wird die anonyme innere Java-Klasse nicht zum Erstellen neuer Klassen verwendet. Vielmehr verwenden wir zum Überschreiben Methoden einer Klasse oder Schnittstelle.

Sie sind auch in der Grafikprogrammierung nützlich, wo wir Implementierungsklassen für Listener-Schnittstellen schreiben.

Die Syntax der anonymen inneren Java-Klasse ähnelt dem Aufruf eines Konstruktors, außer dass die Klassendefinition auch innerhalb des Codeblocks vorhanden ist.

Syntax:

Demo d = new Demo() {
  public void demo_method() {
    // definition
  }
};

demo bezieht sich hier auf eine abstrakte/konkrete Klasse oder eine Schnittstelle. Um das Konzept einer anonymen inneren Klasse besser zu verstehen, sehen wir uns an, wie sie sich von einer regulären Java-Klasse unterscheidet.

  • Wir können eine beliebige Anzahl von Schnittstellen mit einer normalen Klasse implementieren, aber die anonyme innere Klasse implementiert jeweils nur eine Schnittstelle.
  • Eine reguläre Klasse kann eine andere Klasse erweitern und gleichzeitig mehrere Interfaces implementieren. Andererseits kann eine anonyme innere Klasse nur eines dieser Dinge gleichzeitig tun.
  • Der Name des Konstruktors ist derselbe wie der Name einer Klasse. Dies impliziert, dass wir eine beliebige Anzahl von Konstruktoren in einer regulären Klasse schreiben können, aber dies gilt nicht für eine anonyme innere Klasse.

Weitere Informationen zu inneren Klassen in Java finden Sie in dieser Dokumentation.

Variablen und Mitglieder der anonymen inneren Klasse in Java

Anonyme innere Klassen erfassen ebenso wie jede lokale Klasse in Java Variablen. Der Zugriff auf lokale Variablen ist der gleiche wie bei einer einschließenden Klasse.

Die Mitglieder der einschließenden Klasse sind für die anonyme Klasse zugänglich. Es kann jedoch nicht auf lokale Variablen zugreifen (nicht einmal auf diejenigen, die in seinem umschließenden Gültigkeitsbereich vorhanden sind), die nicht endgültig sind.

Wenn wir einen beliebigen Typ in einer anonymen Klasse deklarieren, werden darüber hinaus andere Deklarationen mit demselben Namen in diesem Bereich überschattet. Die anonyme innere Klasse hat ebenfalls einige Einschränkungen.

  • Die anonyme innere Klasse lässt die Deklaration statischer Initialisierer oder Member-Schnittstellen nicht zu.
  • Statische Mitglieder können Teil der anonymen Klasse sein, wenn sie konstante Variablen sind.

Es kommt zu dem Schluss, dass wir ein Feld, zusätzliche Methoden, Instanzinitialisierer und lokale Klassen innerhalb einer anonymen Klasse deklarieren können.

Erstellung anonymer innerer Klassen in Java

Es gibt zwei Möglichkeiten, wie wir eine anonyme innere Klasse erstellen können. Dazu gehören die Verwendung von:

  • Eine Klasse (abstrakt oder konkret)
  • Eine Schnittstelle

Schauen wir sie uns nacheinander an.

Verwenden Sie eine Klasse, um eine anonyme innere Klasse in Java zu erstellen

Sehen Sie sich zunächst das Beispiel unten an.

abstract class Demo {
  abstract void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      void demo() {
        System.out.println("This is a demo of an anonymous inner class using  class.");
      }
    };
    d.demo();
  }
}

Ausgabe:

This is a demo of an anonymous inner class using class.

Hier wird eine Klasse erstellt, deren Name vom Compiler festgelegt wird. Diese Klasse erweitert die Klasse Demo und implementiert die Methode demo().

Das Objekt einer anonymen Klasse ist d. Es ist die Referenzvariable der anonymen Klasse Demo. Beachten Sie, dass wir dies zum Kompilieren als AnonymousDemo.java speichern.

Der folgende Code zeigt, wie der Compiler die interne Klasse generiert.

import java.io.PrintStream;
static class AnonymousDemo$1 extends Demo {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is a demo of an anonymous inner class using class.");
  }
}

Verwenden eine Schnittstelle zum Erstellen einer anonymen inneren Klasse in Java

Im obigen Abschnitt verwenden wir eine Klasse. Aber hier verwenden wir eine Schnittstelle für die anonyme innere Klasse. Lassen Sie uns dies anhand eines Beispiels verstehen.

interface Demonstration {
  void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demonstration d = new Demonstration() {
      public void demo() {
        System.out.println("This is an example of an anonymous inner class using an interface.");
      }
    };
    d.demo();
  }
}

Ausgabe:

This is an example of an Anonymous inner class using an interface.

Hier wird eine Klasse erstellt, deren Name vom Compiler festgelegt wird. Diese Klasse implementiert die Schnittstelle Demonstration und liefert die Implementierung der Methode demo().

Das Objekt einer anonymen Klasse ist d. Es ist die Referenzvariable des Typs Demonstration. Beachten Sie, dass wir dies zum Kompilieren als AnonymousDemo.java speichern.

Der folgende Code zeigt, wie der Compiler die interne Klasse generiert.

import java.io.PrintStream;
static class AnonymousDemo$1 implements Demonstration {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is an example of an anonymous inner class using an interface.");
  }
}

Verschiedene Arten anonymer innerer Klassen in Java

Die anonymen inneren Klassen werden basierend auf Deklaration und Verhalten in 3 Typen eingeteilt.

  • Anonyme innere Klasse, die eine Klasse erweitert.
  • Anonymous Inner-Klasse, die eine Schnittstelle implementiert.
  • Die anonyme innere Klasse wird innerhalb des Methoden-/Konstruktorarguments definiert.

Lassen Sie uns alle diese drei Typen nacheinander besprechen.

Anonyme innere Klasse, die eine Klasse in Java erweitert

Wir können einen Thread erstellen, indem wir eine Thread-Klasse erweitern, und wir können auch eine anonyme innere Klasse haben, die eine Klasse erweitert.

Wir verwenden hier das Schlüsselwort new, um ein Objekt zu erstellen, das auf den übergeordneten Klassentyp verweist. Sehen Sie sich das Beispiel unten an.

class Demo {
  public void example() {
    System.out.println("Types of Anonymous classes");
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d1 = new Demo();
    d1.example();
    Demo d2 = new Demo() {
      @Override
      public void example() {
        System.out.println("Type - 1");
      }
    };
    d2.example();
  }
}

Ausgabe:

Types of Anonymous classes
Type - 1

Anonyme innere Klasse, die eine Schnittstelle in Java implementiert

Wir können einen Thread erstellen, indem wir die Runnable-Schnittstelle implementieren, und die anonyme innere Klasse kann auch eine Schnittstelle implementieren. Wir verwenden das Schlüsselwort new, um ein anonymes Objekt einer inneren Klasse zu erstellen, das auf einen Schnittstellentyp verweist.

interface Demo {
  public void demo();
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 2");
      }
    };
    d.demo();
    System.out.println(d.getClass().getName());
  }
}

Ausgabe:

Type - 2
AnonymousDemo$1

Anonyme innere Klasse innerhalb eines Methoden-/Konstruktorarguments in Java

Die anonyme innere Klasse innerhalb eines Methoden- oder Konstruktorarguments findet Verwendung in GUI-Anwendungen (Graphical User Interface). Hier verwenden wir die anonyme innere Klasse als Argument und übergeben sie an Methoden oder Konstruktoren.

Hier ist ein Beispiel.

abstract class Demo {
  public abstract void demo();
}
class Example {
  public void example(Demo d) {
    d.demo();
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Example e = new Example();
    e.example(new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 3");
      }
    });
  }
}

Ausgabe:

Type - 3

Vorteile der anonymen inneren Klasse in Java

Die anonyme innere Klasse schließt über den lokalen Variablen der Methode, ein zusätzlicher Vorteil gegenüber inneren Klassen. Darüber hinaus reduzieren diese Klassen die Ausführlichkeit und bieten Wiederverwendbarkeit.

Außerdem helfen diese Klassen Entwicklern, da sie nicht für jede Klasse selbst einen Namen finden müssen. Wir können eine Klasse deklarieren und instanziieren, indem wir gleichzeitig die anonymen inneren Klassen verwenden.

Insgesamt ist die anonyme innere Klasse einer der Vorteile von Java.

Um mehr über die anonyme innere Klasse in Java zu erfahren, lesen Sie diese Dokumentation.

Fazit

In diesem Artikel haben wir die anonyme innere Java-Klasse besprochen. Wir haben den Unterschied zwischen regulären Klassen und anonymen inneren Klassen gesehen.

Wir haben auch die Verwendung und die Vorteile der anonymen inneren Java-Klasse besprochen. Darüber hinaus haben wir die Implementierung und Syntax anhand von Codes und Beispielen verstanden. Wir haben sogar etwas über die verschiedenen Arten anonymer innerer Java-Klassen gelernt.

Zusammenfassend trägt die anonyme innere Klasse in Java zur Funktionalität und Vielseitigkeit der Sprache bei, indem sie Wiederverwendbarkeit bietet und Wortreichtum reduziert.

Verwandter Artikel - Java Class