|
JSem: 2.5 |
In Java, si possono distinguere, in un primo tempo (vedremo poi che non è del tutto così) due modi per passare dei parametri ad un metodo: Chiamata per valori.
L'outpout di questa applet è:
La terza riga è un pò sorprendente in quanto ci si aspetterebbe che, a questo punto, il valore di x fosse 11, invece appena uscito dal metodo x ha ripreso il suo valore iniziale 10. Infatti, Java fa una copia del valore del parametro e mette questa copia sullo "stack" (locazione di memoria). Il metodo lavora con questa copia. Quando si esce dal metodo, Java abbandona lo stack e le modifiche apportate al parametro sono perse. Ricordiamoci che una variabile è un contenitore (locazione di memoria) che contiene dei dati (valore della variabile); al metodo viene passato il contenuto, non il contenitore. In altri termini, il metodo non conosce l'indirizzo di memoria della variabile, e quindi non può modificarne il valore. Chiamata per riferimento. La situazione è diversa quando il parametro è un oggetto, in questo caso viene effettuata una chiamata per riferimento, questo permette al metodo di accedere all'oggetto, pertanto le modifiche effettuate dal metodo saranno visibili anche fuori dal metodo. Esempio:
L'outpout di questa applet è:
Vediamo quindi che, una volta uscito dal metodo, l'oggetto conserva le modifiche apportate dal metodo. ATTENZIONE!! Le cose non sono poi così semplici perchè Java passa i riferimenti per valori. Consideriamo il problema dello scambio: per scambiare A e B si mette A in T, poi B in A e T in B. Cerchiamo di applicare questo metodo su degli oggetti, dalla discussione precedente ci sembra di avere capito come fare:
Sorprendentemente, l'output è:
Il metodo è riuscito nel cambiare la prima coordinata di X ma lo scambio tra X e Y non è riuscito!! C'è da mettersi le mani nei cappelli! Per capire cos'è successo, ricordiamoci intanto che un oggetto è una serie di dati e una referenza a questi dati, nel caso specifico l'oggetto coppia X consiste nei due dati (di tipo int) prima e seconda coordinata e di una referenza a questi dati: ![]() quando l'oggetto viene passato al metodo, il metodo fa una copia del riferimento: ![]() Dopo le prime istruzioni: A.x = 100; A.y = 100; la situazione è la seguente: ![]() Dopo, il metodo effetua sì lo scambio, ma sulle copie dei riferimenti: ![]() Finalmente, quando si esce dal metodo, come al solito, le copie (dei riferimenti) vengono abbandonate e rimaniamo con: ![]() Ecco perchè lo scambio delle coppie può dare dei risultati inaspettati! |
next content previous