bassanio69 ha scritto:
ripropongo la domanda in modo più corretto, come funziona il passaggio di parametri per riferimento? E qual'è la differenza con i passaggio per valore?
Forse cosi' lo capisci meglio:
il passaggio di un parametro
per valore vuol dire che passi
una copia del parametro alla funzione/metodo chiamata.
Se questa funzione cambia il valore del paramero
o di una sua parte questa modifica
non e' visibile all'esterno ed in particolare alla funzione/metodo chiamante. Perche', appunto, sta' lavorando
su una copia diversa dall'originale.
Ora fino a che ragioni in termini di intero, float, byte, il concetto e' abbastanza semplice, perche' ci sono pochi byte da copiare (1,2,4,8).
Ma immagina di avere una struttura dati che usa UN MEGABYTE di memoria, se la devi passare per valore, devi creare una sua copia che occupa, ovviamente, UN MEGABYTE.
Per l'oggetto String la questione e' un po' (decisamente) piu' subdola, ma ci arriviamo fra un po'.
Se passi un parametro
per reference vuol dire che
non passi una copia del parametro, ma un
riferimento (
reference,, appunto) al parametro. In altri termini, quandi usi quel parametro, stai accedendo all'oggetto
originale!
Nel caso dell'oggetto da UN MEGABYTE, se lo passi per reference, devi passare SOLO OTTO BYTE! Un miglioramento non da poco
Cosa succede se modifichi un l'oggetto passato per reference, o una sua parte? Che, quando esci dalla funzione/metodo, la funzione/metodo chiamante
vede le modifiche apportate. Perche' l'oggeto su cui ha agito la funzione/metodo chiamata, e'
sempre lo stesso.
Alcuni oggetti hanno una
semantica particolare: sono
immutabili cioe' non possono essere modificati!
E' il caso della stringa, che viene passata per
reference, ma
non potendo modificarla, l'unico modo e' quello di creare un'altra stringa.
Conseguenza, anche se la stringa e' passata per reference, non potendo essere modificata,
e' come se fosse passata per valore.
Se, invece della stringa, passi un StringBuffer,
che puo' essere modificato (basta fare un'append), vedi che si ritorna al discorso di partenza.
Perche' non si passa un oggetto per valore?
E' una specifica decisione progettuale del linguaggio. A a che fare con diverse questioni abbastanza complicate, tra cui l'uso del
garbage collector.
Un linguaggio in cui puoi decidere se passare un parametro per reference o per valore (ma anche qui ci sono dettagli abbastanza sobdoli da considerare) e' il C++.
Anche se in Java non hai accesso ai puntatori, non puoi applicare l'aritmetica dei puntatori, questo
non ti risparmia dal fatto di capire che cosa sono i puntatori. Un
reference in fatti, non e' altro che un
puntatore