Tutto il blog è stato spostato all'indirizzo
http://pierprogramm.altervista.org/wordpress/


I post memorizzati qui non verranno rimossi ma saranno obsoleti. Questo blog non sarà più aggiornato.

venerdì 20 luglio 2012

Java passaggio parametri per riferimento

Girando per il web ho percepito un po' di confusione su questo concetto che vorrei provare a chiarire una volta per tutte.
Il passaggio di parametri (oggetti) per riferimento in Java è possibile.

"A differenza del C++, non è previsto l'uso dei puntatori".
Questa frase vuol dire che il programmatore non puo' sapere l'indirizzo del valore fisico della variabile, ma e' opportuno sapere che se la variabile e' un oggetto allora essa e' un puntatore all'oggetto e si comporta come tale.

Se invece la variabile e' di tipo primitivo allora mettiamoci l'anima in pace il passaggio per riferimento e' impossibile. ma se la variabile e' (un puntatore ad) un oggetto allora il passaggio per riferimento e' possibile perche' la variabile referenzia l'oggetto.

Quindi non e' un "mito" quello che dice che se ad un metodo viene passato un oggetto, il passaggio e' per riferimento.

Provare per credere, vediamo un esempio

Se ad un metodo passi il riferimento ad un oggetto e il metodo modifica l'oggetto, la modifica si ripercuote fuori dal metodo su quell'oggetto.

public static void inverti( String[] onetwo ){
        onetwo[0] = "due";

        onetwo[1] = "uno"; 
}
public static void main(String args[]){
    String[] unodue = {"uno", "due"};

    System.out.println("Prima del metodo: one = "+unodue[0]+" ;   two = "+unodue[1]);
   
    inverti(unodue);

    System.out.println("Dopo il metodo: one = "+unodue[0]+" ;   two = "+unodue[1]);
}

L'array di String e' un oggetto, nel metodo inverti esso viene modificato e questa modifica si ripercuote sull'array del main. Questo avviene perche' il passaggio di parametri (oggetti) ad un metodo avviene per riferimento.

Quando si tratta di tipi primitivi allora ci si deve inventare qualcos'altro (variabili d'istanza magari o farsi un wrapper con get e set).
Qualcuno dira' ma non esistono le classi wrapper? Sì esistono ma sono in read-only cioe' il valore primitivo che incapsulano non puo' essere modificato. L'unico modo per modificare il valore di un Integer e creare un nuovo oggetto, ma cosi' la variabile del metodo puntera' ad un oggetto diverso.

Nessun commento:

Posta un commento