Passaggio per valore
Dato il codice
... alfa(); ... public static void alfa() { double x=1.0, y=2.0; System.out.println("Alfa 1: " + x + " " + y); beta(x, y); System.out.println("Alfa 2: " + x + " " + y); } ... public static void beta(double p, double q) { System.out.println("Beta 1: " + p + " " + q); p=p+q; System.out.println("Beta 2: " + p + " " + q); }
la sua esecuzione produrrà l’output
Alfa 1: 1.0 2.0 Beta 1: 1.0 2.0 // p e q assumono i valori di x e y Beta 2: 3.0 2.0 // p e q subiscono degli aggiornamenti in B Alfa 2: 1.0 2.0 // x e y mantengono i valori precedenti...
I parametri di tipo primitivo (byte, short, int, long, float, double, boolean, char) o String utilizzano il passaggio per VALORE (il parametro formale è una risorsa locale al metodo che ha come valore iniziale il valore del parametro attuale).
Passaggio per riferimento
Dato il codice
... alfa(); ... public static void alfa() { double x[]={1.0, 2.0}; System.out.println("Alfa 1: " + x[0] + " " + x[1]); beta(x); System.out.println("Alfa 2: " + x[0] + " " + x[1]); } ... public static void beta(double v[]) { System.out.println("Beta 1: " + v[0] + " " + v[1]); v[0]=v[0]+v[1]; System.out.println("Beta 2: " + v[0] + " " + v[1]); }
la sua esecuzione produrrà l’output
Alfa 1: 1.0 2.0 Beta 1: 1.0 2.0 // v assume il valore di x Beta 2: 3.0 2.0 // v[0] subisce degli aggiornamenti in B Alfa 2: 3.0 2.0 // x[0] è cambiato..
Anche il parametro di tipo NON primitivo (array, oggetto…) utilizza il passaggio per VALORE, ma siccome il suo valore è un RIFERIMENTO alla risorsa le modifiche su v[0] in beta() in realtà avvengono su x[0] in alfa().
In Java NON è possibile modificare il valore del parametro ATTUALE x, agendo sul parametro FORMALE v, perché il passaggio è sempre per VALORE.
Altri linguaggi sono molto più flessibili (troppo…)