  |
Primitivi |
  |
a = b; |
  |
L'assegnamento ha copiato il valore |

  |
a = 3; b == 2 |
  |
b non è stato modificato |

  |
Classi |
  |
t = s; |
  |
L'assegnamento ha copiato il riferimento |

  |
t.push(3); s.pop()==3 |
  |
s è stato modificato operando su t |

Più importante è considerare quello che avviene quando si copiano i valori contenuti nelle variabili. Nella prima riga a sinistra vediamo cosa succede, quando si assegna il valore di una variabile (che contiene un tipo primitivo) ad un altra variabile. Il valore viene fisicamente copiato dalla prima nella seconda. Invece a destra vediamo cosa avviene quando si assegna il valore di una variabile che contiene un riferimento ad un oggetto. In pratica non viene copiato oggetto ma solamente su riferimento con il risultato che avremo 2 variabili che si riferiscono allo stesso oggetto.
L'effetto di questo fatto viene illustrato nella seconda riga. A sinistra notiamo come assegnare un valore ad una variabile non ha alcun impatto su quello che succede all'altra variabile. Con l'assegnamento è stata fatta una copia, e i due tipi primitivi sono ormai cose separate, per di più interamente contenute dentro le loro scatole, che sono le variabili.
Invece con i oggetti si ha un fenomeno completamente diverso: l'oggetto in realtà è uno solo, e facendo assegnamento si è copiato solamente il puntatore all'oggetto. Di conseguenza fare una modifica l'oggetto invocando un metodo su una variabile comporta che questa di modifica sarà visibile anche all'oggetto, anche quando viene acceduto usando l'altra variabile.
|