2015-09-02 14 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(); 
    } 
} 

Ich bin mir bewusst, dass abstrakte Klassen nicht instanziiert werden können, aber in diesem Code verwirrt. Eigentlich, was dieser Code bedeutet?Kann eine abstrakte Klasse instanziiert werden?

+0

Es macht mich traurig, dass diese offensichtlich doppelte Frage gesammelt * 13 * upvotes. – Raedwald

Antwort

30

Die Subtilität ist hier in der "{}". Es bedeutet, dass Sie explizit bieten eine anonyme Implementierung für die fehlenden Teile (die fehlenden Teile sind abstrakte Methoden) der abstrakten Klasse A ermöglicht es Ihnen, es zu instanziieren.

Aber es gibt keine abstrakte Methode in A, daher ist die anonyme Implementierung leer.

Beispiel das Verhalten mit mindestens einer abstrakten Methode zeigt:

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

Ich kann nicht entscheiden, ob das eine "coole" Sache ist, die Java hat, dass C# nicht tut; zu einem Workaround für Java haben nicht ursprünglich Delegaten und Events. –

+0

Gibt es einen Grund, Klasse A als abstrakt zu deklarieren, obwohl Sie keine abstrakten Methoden darin haben (wie im Beispiel der OP-Frage)? Warum nicht einfach das Qualifikationsmerkmal "abstract" aus der Deklaration der Klasse A entfernen. – Brandin

+0

@Brandin - Vielleicht möchten Sie eine Basisklasse mit einigen nicht abstrakten Methoden, die niemals instanziiert werden sollen? Wie zum Beispiel eine 'Shape' Klasse, die von' Triangle', 'Square' usw. geerbt wird und eine gemeinsame Methode' getLocation() 'hat, aber Sie möchten niemals, dass jemand eine Instanz von' Shape' erstellt . Es existiert nur für die Vererbung. – Davor

14

Dies nennt man eine anonyme innere Klasse. Sie instanziieren die abstrakte Klasse nicht, Sie instanziieren die konkrete anonyme innere Klasse, die die abstrakte Klasse erweitert. Damit dies erlaubt ist, muss die anonyme innere Klasse natürlich Implementierungen für alle abstrakten Mitglieder der abstrakten Oberklasse bereitstellen ... was sie in diesem Fall tut, weil die abstrakte Oberklasse keine abstrakten Mitglieder hat.

Verwandte Themen