Come può una classe anonima utilizzare "extends" o "implements"?


96

Come può una classe anonima estendere una superclasse o implementare un'interfaccia?


Sfortunatamente, devi rendere visibile il costruttore in posti che altrimenti non sarebbe.
Sridhar Sarnobat

Risposte:


98

Le classi anonime devono estendere o implementare qualcosa, come qualsiasi altra classe Java, anche se è solo java.lang.Object.

Per esempio:

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

Ecco run oggetto di una classe anonima che implementa Runnable.

Una classe anonima può estendere un'altra classe utilizzando la stessa sintassi:

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

Quello che non puoi fare è implementare più di un'interfaccia. Hai bisogno di una classe con nome per farlo. Né una classe interna anonima, né una classe denominata, tuttavia, possono estendere più di una classe.


1
Non credo che la seconda espressione sia corretta. Hai già dichiarato il nome della classe come SomeClass, non è più anonimo. Dai un'occhiata a questo link docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm Quando si "nuova" un'interfaccia, viene creata una classe anonima estendendo la classe "Object" e implementando tale interfaccia. Ma mentre "newing" una classe con la prima espressione che hai scritto, una classe anonima (in effetti, è un'istanza di quella classe anonima che viene creata) verrà creata estendendo quella classe.
lixiang

8
@youmiss: la seconda espressione creerà un'istanza di una classe anonima che si estende SomeClass. È ancora anonimo, a causa del {...}.
skaffman

1
Capisco, ho trascurato il {...}.
lixiang

36

Una classe anonima di solito implementa un'interfaccia:

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

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

Se intendi se puoi implementare 2 o più interfacce, penso che non sia possibile. È quindi possibile creare un'interfaccia privata che combini i due. Anche se non riesco a immaginare facilmente perché vorresti che una classe anonima avesse questo:

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

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

 }

Mi piace questa risposta perché è compatibile con Google per le persone che cercano di implementare 2 o più interfacce in un'implementazione singola.
L. Holanda

16

Le classi anonime estendono sempre la superclasse o implementano le interfacce. per esempio:

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

Inoltre, sebbene la classe anonima non possa implementare più interfacce, è possibile creare un'interfaccia che estende un'altra interfaccia e consentire alla classe anonima di implementarla.


11

Credo che nessuno abbia capito la domanda. Immagino che quello che voleva questo ragazzo fosse qualcosa del genere:

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

perché ciò consentirebbe cose come più implementazioni dell'interfaccia:

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

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

questo sarebbe davvero bello davvero; ma non è consentito in Java .

Quello che puoi fare è usare le classi locali all'interno dei blocchi del metodo:

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

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

Esattamente, questo è ciò che intendeva l'OP IMHO
DanielCuadra

dare un pollice per rispondere alla domanda posta. che è normale in SO che alle persone piace rispondere a ciò che dovrebbe essere chiesto e non a ciò che è stato chiesto.
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!"); }
    }
);

1

Una classe anonima si sta estendendo o implementando durante la creazione del suo oggetto Ad esempio:

Interface in = new InterFace()
{

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

}

Qui la classe anonima sta implementando Interface.

Class cl = new Class(){

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

}

qui la classe anonima sta estendendo una classe astratta.


Non vedo la differenza. In che modo il tuo è diverso dal mio.
trapedInBatcaveWithBAtman

uno bello e compatto, quello che mi manca nella tua risposta è una parola come "sempre" o "must" :)
kiedysktos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.