Newsgroup: it.comp.java
Titolo: scambio di variabili

Come posso costruire un metodi che scambi il valore di due variabili x e y?
Es.
private void scambio(int x,int y)
 {
  int s=x;
  x=y;
  y=s;
 }
Il problema è che richiamando il metodo con "scambio(a,b);" i valori di a e 
b dovrebbero scambiarsi (qualunque nome abbiano), mentre mi sembra che i 
valori di x e y rimangano "privati".
N.B. Se è troppo complicato, tanto vale ripetere le tre righe di cui sopra 
quando serve... 

Mi servirebbe qualcosa tipo quanto descritto alla pagina 
http://programmazione.html.it/c/c_28.htm
, ma con java, ovviamente, e non col 
C. Esiste la possibilità di passare il puntatore alla variabile, anzichè la 
variabile stessa, anche in java? 

 valori di x e y rimangano "privati".
In java il passaggio dei parametri avviene sempre per valore (mai per 
puntatore).
Nel caso di tipi primitivi (tipo int, char, float, etc.) viene passato 
quindi direttamente
il valore. All'interno del metodo scambio(...) in realta' tu lavori con 
delle copie
dei parametri x,y originali.
Nel caso che i parametri di un metodo siano oggetti (anche definiti 
dall'utente)
il valore passato non e' altro che il valore della locazione di memoria che 
contiene l'oggetto-parametro.
Tu all'interno del tuo metodo non potrai quindi far puntare l'oggetto in 
input ad un'altra locazione, viceversa
potrai cambiare le proprieta' interne all'oggetto (tramite i classici metodi 
setNomeProprieta(...) ad esempio).
Queste modifiche verranno viste anche dal chiamante del metodo (quindi 
dall'esterno).
Salvo Di Loro 

 valori di x e y rimangano "privati".
il punto è questo: int x, int y che metti nel metodo sono due dichiarazioni
a tutti gli effetti. Le variabili vengono dichiarate lì e inizializzate
*copiandovi* il valore dei parametri che passi tu.
In pratica quelle sono delle copie locali, che seguono le regole di
visibilità che dovresti conoscere, e non sono i valori a e b che passi alla
chiamata del metodo.
Ovviamente modificare le copie non ha effetti sugli originali.
esattamente come se facessi:
private void scambio (int x, int y) {
int prima = x, seconda = y;
int temp = prima;
prima = seconda;
seconda = temp;
}
scommetto che in questo caso non penseresti che i valori vengono scambiati.
Questo vale sempre, anche in C. In C però esiste il passaggio per indirizzo,
tramite i puntatori. Con una copia del puntatore puoi accedere alla
varibile. Ripeto: tramite una *copia* del puntatore accedi alla variabile.
Quindi è ovvio che anche in quel caso viene fatta una copia, ma
dell'indirizzo (o puntatore) della variabile e quindi in quel caso puoi
accedere agli originali.
In Java non è possibile perché è permesso solo il passaggio per valore, non
quello per indirizzo.
A scanso di equivoci e per evitare la solita discussione che segue questa
affermazione il passaggio di un riferimento ad un oggetto NON è un
passaggio per indirizzo ma è anche quello per valore. In quel caso il
valore è il riferimento all'oggetto. Se vi sembra solo un gioco di parole
pensate che in C avreste potuto passare un puntatore al riferimento...
quello sarebbe stato per indirizzo ed infatti in java non si puo' fare.
per concludere una cursiosità:
a = a^b;
b = a^b;
a = a^b;
dove ^ è l'operatore xor, scambia i valori di a e di b senza variabile
d'appoggio
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/


E questo lo avevo capito, se no non avrei posto il quesito. Ora, se voglio 
passare parametri in uscita, possibile che possa farlo su UN solo valore per 
metodo?
Se dichiaro
private int scambio (int x, int y)
posso passare una delle due, richiamando il metodo con
x=scambio(x,y)
ma se le voglio passare entrambe? Avevo anche pensato a dichiarare
private int [] scambio (int x, int y);
Solo che il richiamo dovrebbe essere qualcosa tipo
v[]=scambio(x,y);
x=v[0];
y=v[1];
...e faccio prima a scambiare le variabili ogni volta, senza subroutine...
Tenete presente che non posso dichiarare x e y cone proprietà della classe, 
perchè... non si chiamano sempre x e y.
Esiste un modo semplice di passare, in uscita, più di una variabile 
attraverso un metodo di una classe? O no?

 quando serve... 
Infatti, IMHO.

 Non puoi fare un metodo di scambio fra tipi nativi.
... e non si possono avere, in uscita, DUE diverse variabili, ma al massimo 
una strutturata (tipo vettore), giusto? 

 attraverso un metodo di una classe?
No.
