2013-10-28 8 views
7

Si noti che non è possibile costruire un oggetto di una classe astratta, ma è comunque possibile avere un riferimento all'oggetto il cui tipo è una classe astratta. Naturalmente, l'oggetto reale a cui si riferisce deve essere un'istanza di una sottoclasse concreta:In che modo le classi astratte possono avere riferimenti ma non oggetti?

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

Non capire il motivo per cui si può avere un riferimento oggetto una classe astratta ...

risposta

10

Quando si dispone di un riferimento a oggetti il ​​cui tipo è una classe astratta, tale riferimento non significa "sto facendo riferimento a una classe astratta". Invece, significa "Sto facendo riferimento ad un oggetto reale che è una sottoclasse di quella classe astratta". Questo è il motivo per cui è possibile fare riferimento al riferimento a SavingsAccount, che è una classe non astratta che sottoclasse da Account, ma non è possibile farlo puntare a new Account(), poiché non è possibile creare un'istanza Account.

Si noti che il riferimento stesso non è un'istanza reale della classe astratta.

Spero che questo aiuti!

+0

Ok così quando si fanno cose come Account anAccount; cosa sta dicendo? in realtà non sta indicando nulla? Anche se non fosse una classe astratta, diciamo String tmp; non hai ancora dato un indirizzo? – user2809437

+0

@ user2809437- È corretto. Quando pronunci "Account anAccount", ottieni un riferimento chiamato "anAccount" che inizialmente contiene "null", il che significa che non punta a nulla. È lo stesso con 'String tmp'; ottieni un riferimento a 'String', ma punta a' null' perché non l'hai ancora assegnato a un 'String'. – templatetypedef

+0

Un'altra domanda ... che senso ha farlo? Se non è possibile creare un'istanza della classe, perché entrambi con il riferimento? – user2809437

1

Il problema è che non è possibile chiamare le routine membro astratte.
Quando chiami "nuovo", in realtà stai chiamando il costruttore della classe.
Poiché si sta tentando di chiamare una funzione membro astratta si ottiene un errore.

È possibile fare riferimento a una classe astratta, perché è solo un modello per una classe reale che ne deriva. Un po 'come un'interfaccia ma con l'ereditarietà.
Proprio come non è possibile creare un'istanza di un'interfaccia, non è possibile creare un'istanza di una classe astratta.

Questo ovviamente fa parte di polymorphism.
Le differenze tra le classi astratte e le interfacce sono notevolmente piccole, vedere: Interface vs Abstract Class (general OO)

Problemi correlati