2015-09-02 29 views
16
abstract class A { 
    public void disp() { 
     System.out.print("Abstract"); 
    } 
} 

public class B { 
    public static void main(String args[]) { 
     A object = new A(){ }; 
     object.disp(); 
    } 
} 

Sono consapevole che le classi astratte non possono essere istanziate, ma confuse su questo codice. In realtà cosa significa questo codice?È possibile istanziare una classe astratta?

+0

Mi rattrista che questa domanda evidentemente duplicata abbia raccolto * 13 * voti positivi. – Raedwald

risposta

30

La sottigliezza qui è in "{}". Significa che esplicitamente fornire un'implementazione anonima per le parti mancanti (le parti mancanti sono metodi astratti) della classe astratta A che consente di istanziarla.

Ma non c'è un metodo astratto in A, quindi l'implementazione anonima è vuota.

Esempio mostra il comportamento con almeno un metodo astratto:

public abstract class A { 
    public abstract void bar(); 
    public void disp() { System.out.print("Abstract"); } 
} 

public class B { 
    public static void main(String args[]) { 
     A object = new A() { 
      @Override public void bar() { System.out.print("bar"); } 
     }; 
     object.disp(); //prints "Abstract" 
     object.bar(); //prints "bar" 
    } 
} 
+0

Non riesco a decidere se questa è una cosa "fica" che Java ha che C# 'no; una soluzione alternativa per java non ha in origine delegati ed eventi. –

+0

C'è un motivo per dichiarare la classe A come astratta, anche se non ci sono metodi astratti (come nell'esempio della domanda OP)? Perché non basta rimuovere il qualificatore "astratto" dalla dichiarazione di classe A. – Brandin

+0

@Brandin - forse vuoi una classe base con alcuni metodi non astratti che non dovrebbero mai essere istanziati? Come, una classe 'Shape', che è ereditata da' Triangle', 'Square' e così via, e ha un metodo condiviso' getLocation() ', ma non si vuole mai che qualcuno faccia un'istanza di' Shape' . Esiste solo per eredità. – Davor

14

Questo viene chiamato anonima classe interna. Non stai istanziando la classe astratta, stai istanziando la classe interna anonima che estende la classe astratta. Naturalmente, affinché ciò sia consentito, la classe interiore anonima deve fornire implementazioni per tutti i membri astratti della superclasse astratta ... cosa che in questo caso fa, perché la superclasse astratta non ha membri astratti.

Problemi correlati