Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Metodi 3

Precedente
SUPERIORE
Successiva

Passaggio per valore

Dato il codice

static void A()
{
   double x=1.0, y=2.0;
   System.out.println("A1: " + x + "\t" + y);
   B(x, y);
   System.out.println("A2: " + x + "\t" + y);
}

static void B(double p, double q)
{
   System.out.println("B1: " + p + "\t" + q);
   p=p+q;
   System.out.println("B2: " + p + "\t" + q);
}

la sua esecuzione produrrà l'output

A1: 1.0 2.0
B1: 1.0 2.0   // p e q assumono i valori di x e y
B2: 3.0 2.0   // p e q subiscono degli aggiornamenti in B
A2: 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

static void A()
{
   double x[]={1.0, 2.0};
   System.out.println("A1: " + x[0] + "\t" + x[1]);
   B(x);
   System.out.println("A2: " + x[0] + "\t" + x[1]);
}

static void B(double v[])
{
   System.out.println("B1: " + v[0] + "\t" + v[1]);
   v[0]=v[0]+v[1];
   System.out.println("B2: " + v[0] + "\t" + v[1]);
}

la sua esecuzione produrrà l'output

A1: 1.0 2.0
B1: 1.0 2.0   // v assume il valore di x
B2: 3.0 2.0   // v[0] subisce degli aggiornamenti in B
A2: 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 B() in realtà avvengono su x[0] in A().

In Java NON è possibile modificare il valore del parametro ATTUALE, x, agendo sul parametro FORMALE, v, perché il passaggio è sempre per VALORE.

Gli altri linguaggi sono più flessibili (anche troppo...)

Metodi 3 - ApPuNtIdIuNiNfOrMaTiCo

Home • ECDL • Algoritmi • Java • Basi di dati • Seconda prova • Eccetera • Cerca nel sito

Precedente
SUPERIORE
Successiva