2012-04-16 13 views

risposta

13

Si può avere un metodo che richiede solo un'istanza di SuperClass. Dal SubClassè unSuperClass, è possibile utilizzare un'istanza di SubClass e considerarlo come SuperClass.

Lo stesso comportamento viene utilizzato quando si lavora con le interfacce:

List someList = new ArrayList(); 

Questo è il bello di polimorfismo. Ti consente di modificare l'implementazione degli interni della classe senza interrompere il resto del codice.

+4

La cosa fondamentale è che "Sottoclasse" * è una "SuperClass". –

+0

Questo comportamento è cambiato in Java 8? Ho appena testato il caso in cui un metodo accetta un metodo void del parametro superclass (parametro SuperClass), ma sono in grado di inserire un'istanza di sottoclasse 'SubClass sub = new SubClass();' quando lo chiamo, come nel metodo ' (sub); '. Ciò significa che ora è consentita la compatibilità verso l'alto? –

1

Tutto quello che stai facendo è dire alla JVM quale sia il tipo di riferimento al momento della compilazione.

Nel primo caso, stai dicendo che il riferimento all'oggetto ha un tipo statico di super classe. Quando crei un nuovo oggetto sotto-classe, puoi avere quel punto di riferimento su di esso perché una istanza di classe super IS-A di sottoclasse.

4

Il motivo principale per fare il primo è per chiamate di funzione che si aspettano la super classe. Se si dispone di una classe A che dispone di un metodo come questo

public static void insert(SuperClass b) { 
    //do something 
} 

e si ha la

SuperClass object = new SubClass(); 

si può fare

A.insert(object); 

Ma se lo fai

SubClass object new SubClass(); 

non è possibile fare

A.insert(object); 

a meno che non si aggiunge un metodo come questo alla A

public static void insert(SubClass b) { 
    //do something 
} 

Questo aiuta a ridurre il codice ridondante o copiato e mantenere le cose più pulito.

12

Questo è noto come polimorfismo. Immaginate il seguente esempio:

Musician musician = new Pianist(); 

o

Musician musician = new Drummer(); 

Supponiamo Musician classe ha un metodo: play(). Non importa chi sia il musicista, se chiami il metodo di gioco, saprai come suonare lo strumento determinato, basato sulla classe concreta, su questo caso, non importa se Pianista o Batterista.

Ogni classe concreta, sovrascrivendo il metodo play(), può giocare da soli:

esempio per Pianist classe: play() { playsBeethoven(); }

Per informazioni dettagliate, si prega di controllare http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

E 'sempre bene ricordare di usarlo con l'ereditarietà http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

Questo è uno dei motivi principali che si usa l'ereditarietà. Trattate la SuperClass come un'astrazione e al momento della compilazione non è necessario conoscere il tipo derivato, o un'altra classe non ha bisogno di conoscere il tipo derivato. Questo ti permette di usare riferimenti a SuperClass mentre usi il polimorfismo per chiamare i metodi della classe derivata.

Questo vi permette di

a.) Creare le fabbriche in modo che non è necessario conoscere il tipo in fase di compilazione, e si dispone di un metodo di esecuzione che crea i tipi derivati. Pensate a COM, GStreamer, DirectShow, Glib, ecc ...

b.) Nascondi complessità ad altri oggetti esponendo solo i riferimenti di tipo di base anche se sono istanze del tipo derivato. Pensa ai metodi che restituiscono l'oggetto o prendi un riferimento a un oggetto come argomento.

c.) Molte altre possibilità, ma quelle sono probabilmente le due più importanti per voi.

Problemi correlati