Passaggio dei parametri

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…)