Newsgroup: it.comp.java
Titolo: passaggio parametri per reference

1)primo file:
public class s{
    public static void main (String args[]){
        Integer k,w=5;
        k=A.d(w);
        System.out.println(w);
    }
}
2)secondo file contenente la classe A e il metodo d
public class A{
    public static Integer d(Integer w){
        w=(89);
        return w;
    }
}
facendo cosě nel primo programma io passo w alla funzione A.d.
Ma io facendo cosě copio il valore di w nella funzione A.d o passo
l'indirizzo di memoria?il programma dovrebbe modificare w da 89 a 5 ma non
lo modifica...quindi in questo caso non viene passato il reference
dell'oggetto w.
Ma come mai dato che w č trattato come oggetto?se ad esempio trattassi un
vettore, se nel secondo file modificassi il vettore anche nel primo quel
vettore risulterebbe midificato.
Ma come mai w no?
Si, se dassi in uscita k avrei comunque 89, ma a me servirebbe modificare
w senza fare w=k nel main!
come mai?grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 dell'oggetto w
Allora, calma e gesso.
Intanto, l'esempio che hai postato è fallace: spiegami, il tipo di w
qual'è? Da come lo assegni NON è Integer bensì il tipo primitivo
int, che NON è un oggetto e quindi non ha un reference. Di conseguenza
non funziona.
Ma in definitiva, anche se fosse Integer non è un esempio corretto.
Integer wrappa il tipo primitivo int e il suo valore non è
modificabile. Quindi volendo cambiare il valore tu devi riassegnare il
reference ad una nuova istanza di Integer, per cui creando una nuova
istanza è ovvio che non modifichi l'istanza precedente.
Riprova con un'altro tipo modificabile, es. StringBuffer.

in pratica con questa istruzione
w=(89);
richiami il costruttore Integer(int)
e quindi non tocchi il valore interno della variabile integer passata
per riferimento ma cambi il riferimento della variabile locale

Dimitri Ognibene ha scritto:

ok, e se io facessi
w=new Integer(89);
creerei in una nuova locazione di memoria l'indirizzo di w.
In pratica in w c'è un nuovo indirizzo di memoria che ha assegnato 89 ma
così facendo non modificherei la w del main.
Come faccio a passare allora una variabile per riferimento e non per
valore?


 Riprova con un'altro tipo modificabile, es. StringBuffer.
Quindi passare una variabile per riferimento non si può?nel caso passassi
un vettore, ho provato, tutte le modifiche apportate dal metodo chiamante
sul vettore si ripercuotono anche sul vettore passato dal main.
Passare un vettore o una matrice per valore e non per reference è
un'operazione impossibile no?


no non puoi passare una matrice per valore.
in genere l'unico vantaggio di passare una variabile per valore è che
se si modifica la copia nel metodo chiamato questo la può modificare
senza che il venga modificata la variabile originale.. quindi dovresti
farti la copia a mano se vuoi modifcare una variabile che non era
pensata per essere modificata
mmh una domanda sola perchè in java non c'è il const come in c++ il
final non serve a molto sugli array...

 valore?
Semplicemente non si puo'!
In Java il passaggio dei parametri avviene *sempre* per valore.
Se ne e' discusso milioni di volte su questo gruppo: fai
una ricerca con google...
Quando passi un reference, e' questo che viene passato
per valore, quindi il chiamante non lo vedra' mai modificato.
Quindi, non si puo' in nessun modo cambiare l'oggetto "puntato"
da un reference passato come parametro ad un metodo Java.
Ovvio poi che, se il reference "punta" ad un oggetto che ha
attributi o istanze associate modificabili e se il
corpo del metodo modifica tali elementi, allora anche il chiamante
"vedra'" questi cambiamenti.
Ciao!
Roberto