Wie kann eine anonyme Klasse "Erweitern" oder "Implementieren" verwenden?

95

Wie kann eine anonyme Klasse eine Oberklasse erweitern oder eine Schnittstelle implementieren?

Mike Rylander
quelle
Leider müssen Sie den Konstruktor an Stellen sichtbar machen, an denen dies sonst nicht der Fall wäre.
Sridhar Sarnobat

Antworten:

98

Anonyme Klassen müssen wie jede andere Java-Klasse etwas erweitern oder implementieren, auch wenn es nur so ist java.lang.Object.

Beispielsweise:

Runnable r = new Runnable() {
   public void run() { ... }
};

Hier rist ein Objekt einer anonymen Klasse, die implementiert Runnable.

Eine anonyme Klasse kann eine andere Klasse mit derselben Syntax erweitern:

SomeClass x = new SomeClass() {
   ...
};

Was Sie nicht tun können, ist mehr als eine Schnittstelle zu implementieren. Dazu benötigen Sie eine benannte Klasse. Weder eine anonyme innere Klasse noch eine benannte Klasse können jedoch mehr als eine Klasse erweitern.

Skaffman
quelle
1
Ich denke nicht, dass der zweite Ausdruck richtig ist. Sie haben den Namen der Klasse bereits als SomeClass deklariert, er ist nicht mehr anonym. Überprüfen Sie diesen Link docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm Wenn Sie eine Schnittstelle "neu" machen, wird eine anonyme Klasse erstellt, indem Sie die Klasse "Object" erweitern und diese Schnittstelle implementieren. Während Sie eine Klasse mit dem ersten Ausdruck, den Sie geschrieben haben, "neu" erstellen, wird eine anonyme Klasse (tatsächlich wird eine Instanz dieser anonymen Klasse erstellt) durch Erweitern dieser Klasse erstellt.
Lixiang
8
@youmiss: Der 2. Ausdruck erstellt eine Instanz einer anonymen Klasse, die erweitert wird SomeClass. Es ist immer noch anonym, aufgrund der {...}.
Skaffman
1
Ich sehe, ich habe die {...} übersehen.
Lixiang
36

Eine anonyme Klasse implementiert normalerweise eine Schnittstelle:

new Runnable() { // implements Runnable!
   public void run() {}
}

JFrame.addWindowListener( new WindowAdapter() { // extends  class
} );

Wenn Sie meinen, ob Sie 2 oder mehr Schnittstellen implementieren können, dann denke ich, dass das nicht möglich ist. Sie können dann eine private Schnittstelle erstellen, die beide kombiniert. Obwohl ich mir nicht leicht vorstellen kann, warum Sie möchten, dass eine anonyme Klasse das hat:

 public class MyClass {
   private interface MyInterface extends Runnable, WindowListener { 
   }

   Runnable r = new MyInterface() {
    // your anonymous class which implements 2 interaces
   }

 }
Extraneon
quelle
Ich mag diese Antwort, weil sie Google-freundlich für Leute ist, die zwei oder mehr Schnittstellen in einer anon-Implementierung implementieren möchten.
L. Holanda
16

Anonyme Klassen erweitern immer Superklassen oder implementieren Schnittstellen. beispielsweise:

button.addActionListener(new ActionListener(){ // ActionListener is an interface
    public void actionPerformed(ActionEvent e){
    }
});

Obwohl anonyme Klassen nicht mehrere Schnittstellen implementieren können, können Sie eine Schnittstelle erstellen, die andere Schnittstellen erweitert, und Ihre anonyme Klasse diese implementieren lassen.

MByD
quelle
10

Ich denke, niemand hat die Frage verstanden. Ich denke, was dieser Kerl wollte, war so etwas:

return new (class implements MyInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }
});

weil dies Dinge wie mehrere Schnittstellenimplementierungen ermöglichen würde:

return new (class implements MyInterface, AnotherInterface {
    @Override
    public void myInterfaceMethod() { /*do something*/ }

    @Override
    public void anotherInterfaceMethod() { /*do something*/ }
});

das wäre wirklich schön; aber das ist in Java nicht erlaubt .

Was Sie können tun ist verwenden lokale Klassen innerhalb Methode blockiert:

public AnotherInterface createAnotherInterface() {
    class LocalClass implements MyInterface, AnotherInterface {
        @Override
        public void myInterfaceMethod() { /*do something*/ }

        @Override
        public void anotherInterfaceMethod() { /*do something*/ }
    }
    return new LocalClass();
}
Thiagoh
quelle
Genau das beabsichtigte das OP IMHO
DanielCuadra
Geben Sie einen Daumen für die Beantwortung der gestellten Frage. Das ist normal bei SO, dass die Leute gerne antworten, was gefragt werden soll, nicht was gefragt wurde.
mfaisalhyder
3
// The interface
interface Blah {
    void something();
}

...

// Something that expects an object implementing that interface
void chewOnIt(Blah b) {
    b.something();
}

...

// Let's provide an object of an anonymous class
chewOnIt(
    new Blah() {
        @Override
        void something() { System.out.println("Anonymous something!"); }
    }
);
Oliver Charlesworth
quelle
1

Eine anonyme Klasse wird beim Erstellen ihres Objekts erweitert oder implementiert. Beispiel:

Interface in = new InterFace()
{

..............

}

Hier implementiert eine anonyme Klasse Interface.

Class cl = new Class(){

.................

}

hier erweitert anonyme Klasse eine abstrakte Klasse.

trapedInBatcaveWithBAtman
quelle
Ich sehe den Unterschied nicht. Wie deine anders ist als meine.
TrapedInBatcaveWithBAtman
eine schöne und kompakte, was ich in Ihrer Antwort vermisse, ist ein Wort wie "immer" oder "muss" :)
kiedysktos