web-dev-qa-db-fra.com

Comment une classe anonyme peut-elle utiliser "étend" ou "implémente"?

Comment une classe anonyme peut-elle étendre une super-classe ou implémenter une interface?

88
user707549

Classes anonymes must étendre ou implémenter quelque chose, comme toute autre Java classe, même si c'est juste Java.lang.Object.

Par exemple:

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

Ici, r est un objet d'une classe anonyme qui implémente Runnable.

Une classe anonyme peut étendre une autre classe en utilisant la même syntaxe:

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

Ce que vous ne pouvez pas faire, c'est implémenter plus d'une interface. Vous avez besoin d'une classe nommée pour le faire. Cependant, ni une classe interne anonyme, ni une classe nommée ne peuvent étendre plus d'une classe.

93
skaffman

Une classe anonyme implémente généralement une interface:

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

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

Si vous voulez savoir si vous pouvez implémenter 2 ou plusieurs interfaces, je pense que ce n'est pas possible. Vous pouvez ensuite créer une interface privée combinant les deux. Bien que je ne puisse pas facilement imaginer pourquoi vous voudriez qu'une classe anonyme ait cela:

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

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

 }
33
extraneon

Classes anonymes toujours étendre la super-classe ou implémenter des interfaces. par exemple:

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

De plus, bien que la classe anonyme ne puisse pas implémenter plusieurs interfaces, vous pouvez créer une interface qui étend une autre interface et laisser votre classe anonyme la mettre en œuvre.

15
MByD
// 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!"); }
    }
);
3

Une classe anonyme est en cours d'extension ou d'implémentation lors de la création de son objet. Par exemple:

Interface in = new InterFace()
{

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

}

Ici, la classe anonyme implémente Interface.

Class cl = new Class(){

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

}

ici, la classe anonyme étend une classe abstraite.