2012-07-11 13 views
10

Capisco cos'è l'invocazione del metodo java e ho praticato molti esempi che lo utilizzano.Qual è l'uso del richiamo del metodo virtuale Java?

Voglio sapere qual è la situazione pratica o il bisogno di questo concetto. Sarebbe di grande aiuto se qualcuno potesse dare uno scenario del mondo reale in cui viene utilizzato e cosa succederebbe se questo concetto non fosse stato lì?

+3

"scenario in tempo reale" fa * non * significa ciò che pensi che significhi. Quello che ti interessa è uno "scenario del mondo reale". –

+2

Senza questo concetto non avresti l'unica caratteristica che rende interessante il modello OOP di Java: il polimorfismo. –

+1

vedere qui: http://stackoverflow.com/questions/2486160/java-virtual-methods – Tomer

risposta

12

Ecco un esempio. Supponiamo di avere 2 classi:

class A { 
    public String getName() { 
     return "A"; 
    } 
} 

class B extends A { 
    public String getName() { 
     return "B"; 
    } 
} 

Se ora effettuare le seguenti operazioni:

public static void main(String[] args) { 
    A myA = new B(); 
    System.out.println(myA.getName()); 
} 

otteniamo il risultato

B 

Se Java non ha avuto virtual method invocation, sarebbe determinare a compila il tempo che il getName() da chiamare è quello che appartiene alla classe A. Poiché non lo fa, ma lo determina in fase di esecuzione a seconda della classe effettiva a cui punta myA, otteniamo il risultato sopra riportato.

[EDIT per aggiungere (un po 'forzata) esempio]
È possibile utilizzare questa funzione per scrivere un metodo che accetta un numero qualsiasi di Object s come argomento e li stampa in questo modo:

public void printObjects(Object... objects) { 
    for (Object o: objects) { 
    System.out.println(o.toString()); 
    } 
} 

Questo funzionerà per qualsiasi mix di oggetti. Se Java non disponeva di virtual method invocation, tutti gli Oggetti verrebbero stampati utilizzando l'Object toString() che non è molto leggibile. Ora, invece, verrà utilizzato il toString() di ogni classe effettiva, il che significa che la stampa di solito sarà molto più leggibile.

+0

Se volessimo stampare 'B' avremmo chiamato B object = new B(); object.getName(); - Cosa rende speciale un riferimento ad una classe per un oggetto di classe diversa? – Meenakshi

+0

@Keppil Puoi dare un esempio (scenario in tempo reale) per mostrare la situazione spiegata sopra. Sarò lieto di avere una situazione pratica in cui li usiamo. Ho capito la tua spiegazione – Meenakshi

+0

@Meenakshi: Questo è molto utile se abbiamo un metodo da un'API esterna che richiede un oggetto 'A' e che chiamerà getName(). Quindi puoi alimentarlo con un 'B', e in questo modo cambia il modo in cui funziona. Questo è, come affermato da @Vash, chiamato polimorfismo ed è estremamente utile. – Keppil

0

OK, proverò a fornire un semplice esempio. Si sta scrivendo un metodo che riempirà un elenco fornito dal chiamante:

public void fill(List l) { 
    list.add("I just filled the list!"); 
} 

Ora, un chiamante desidera utilizzare un elenco collegato; un altro preferisce un'implementazione di lista basata su un array. Ci saranno altri chiamanti con ancora più implementazioni di elenchi di cui non hai mai nemmeno sentito parlare. Questi sono oggetti completamente diversi. Proporre una soluzione che raggiunga questo senza fare affidamento sui metodi virtuali.

Senza metodi virtuali ciò significherebbe che il tipo List dovrebbe già essere implementato con il metodo add. Anche se avessi un sottotipo ArrayList che aveva un metodo sovrascritto, il compilatore (e il runtime!) Semplicemente ignorerebbe quel metodo e userebbe quello in List. Sarebbe impossibile utilizzare diverse implementazioni List conformi alla stessa interfaccia; sarebbe impossibile riutilizzare quella riga di codice nel metodo fill poiché funzionerebbe solo con il metodo nel tipo List.

Quindi, vedete, l'intera idea della gerarchia di tipi non avrebbe molto senso; interface s e abstract class non potrebbero nemmeno esistere. L'intero Java si scompone in frammenti senza quella caratteristica dei metodi virtuali.

+0

puoi aiutarmi ulteriormente spiegando con un frammento di codice sulla domanda che hai posto senza fare affidamento su metodi virtuali? o ti sembra possibile ...? Se no ... potresti essere un piccolo dettaglio su questo. – Meenakshi

Problemi correlati