2013-10-28 4 views
7

Beachten Sie, dass Sie ein Objekt einer abstrakten Klasse nicht erstellen können, aber Sie können immer noch ein Objekt Referenz, deren Typ eine abstrakte Klasse ist. Natürlich, auf dem das eigentliche Objekt muss eine Instanz einer konkreten Unterklasse sein bezieht:Wie können abstrakte Klassen Referenzen, aber keine Objekte haben?

Account anAccount; // OK 
anAccount = new Account(); // Error—Account is abstract 
anAccount = new SavingsAccount(); // OK 
anAccount = null; // OK 

Nicht zu verstehen, warum Sie einen Objektverweis auf einer abstrakten Klasse haben kann ...

Antwort

10

Wenn Sie Eine Objektreferenz, deren Typ eine abstrakte Klasse ist. Diese Referenz bedeutet nicht "Ich verweise auf eine abstrakte Klasse". Stattdessen bedeutet es "Ich verweise auf ein tatsächliches Objekt, das eine Unterklasse dieser abstrakten Klasse ist." Dies ist der Grund, warum Sie die Referenz auf eine SavingsAccount beziehen können, die eine nicht abstrakte Klasse ist, die von Account Unterklassen ableitet, aber Sie können nicht auf eine new Account() zeigen, da Sie Account nicht tatsächlich instanziieren können.

Beachten Sie, dass die Referenz selbst keine tatsächliche Instanz der abstrakten Klasse ist.

Hoffe, das hilft!

+0

Ok, wenn Sie Dinge wie Konto anAccount; Was sagt das? es deutet nicht auf irgendetwas hin? Auch wenn es keine abstrakte Klasse ist, sagen wir String tmp; hast du noch keine Adresse angegeben? – user2809437

+0

@ user2809437- Das ist richtig. Wenn Sie "Account anAccount" sagen, erhalten Sie eine Referenz namens "anAccount", die anfänglich "null" enthält, was bedeutet, dass sie auf nichts zeigt. Es ist das gleiche mit 'String tmp'; Sie bekommen einen Verweis auf eine 'String', aber sie zeigt auf' null', weil Sie sie noch nicht zugewiesen haben, um auf einen 'String' zu zeigen. – templatetypedef

+0

Noch eine Frage ... was ist der Sinn dies zu tun? Wenn Sie keine Instanz der Klasse erstellen können, warum beide mit der Referenz? – user2809437

1

Das Problem ist, dass Sie abstrakte Member Routinen nicht aufrufen können.
Wenn Sie 'neu' aufrufen, rufen Sie eigentlich den Konstruktor der Klasse auf.
Da Sie versuchen, eine abstrakte Elementfunktion aufzurufen, erhalten Sie einen Fehler.

Sie können eine abstrakte Klasse verweisen, weil es nur eine Blaupause für eine echte Klasse ist, die daraus abgeleitet ist. Ein bisschen wie eine Schnittstelle, aber mit Vererbung.
Genau wie Sie eine Schnittstelle nicht instanziieren können Sie eine abstrakte Klasse nicht instanziieren.

Dies ist natürlich Teil von polymorphism.
Die Unterschiede zwischen abstrakten Klassen und Schnittstellen sind bemerkenswert klein, siehe: Interface vs Abstract Class (general OO)