Newsgroup: it.comp.java
Titolo: copia per valore e per riferimento

qualcuno saprebbe spiegarmi la differenza???

 qualcuno saprebbe spiegarmi la differenza???
Intendi *passaggio* o *copia* ?
Io conosco i seguenti passaggi di parametri:
  Passaggio di parametri per riferimento (ad es. C++)
    void f(int&n) {n = 10;}
    k=0; f(k); printf("k=%d\n");
    /* stampa 10 */
  Passaggio di parametri per indirizzo (ad es. C)
    void f(int*n) {*n = 10;}
    k=0; f(&k); printf("k=%d\n");
    /* stampa 10 */
  Passaggio di parametri per valore (ad es. C, Java)
    void f(int n) {n = 10;}
    k=0; f(&k); printf("k=%d\n");
    /* stampa 0 */
  Passaggio di parametri per risultato (ad es. AlgolW)
     INTEGER J,D; J:=2; D:=W(J); WRITE(J);
     INTEGER PROCEDURE W(INTEGER RESULT M);
     BEGIN M:=4; J:=6; 0 END;
     { stampa 4 }
  Passaggio di parametri per valore e risultato (ad es. AlgolW)
     INTEGER J,D; J:=2; D:=W(J); WRITE(J);
     INTEGER PROCEDURE W(INTEGER VALUE RESULT M);
     BEGIN J:=0; M:=M+2; J:=6; 0 END;
     { stampa 4 }
  Passaggio di parametri per nome (ad es. AlgolW)
     INTEGER J,D; J:=2; D:=W(J-2);
     INTEGER PROCEDURE W(INTEGER M);
     BEGIN J:=6; WRITE M; 0 END;
     { stampa 4 }
Ce ne sono sicuramente altri...
-- Dario

 
Se stai parlando del passaggio di parametri..
almeno con java è per riferimento quando hai come parametro un oggetto
"void miaFunzione(Vector k)"
e in questo caso nella funzione lavori direttamente sull'oggetto passato
e chi chiama la funzione potrebbe ritrovarsi l'oggetto passato come 
parametro modificato.
Mentre per valore è con i tipi base
"void miaFunzione(int j)"
ricevi una copia della variabile quindi se nella funzione modifichi j 
non si ripercuote all'esterno della funzione stessa.
Edoardo
-- 
------------------------------------------------------------
edo...@aspix.it
www.aspix.it
+39 075 9142766
------------------------------------------------------------

 non si ripercuote all'esterno della funzione stessa.
Il passaggio dei parametri in Java e' *sempre* per valore.
Con i tipi primitivi:
   void f(int n) {n=10;}
   ...
   int k=0; int j=k; f(k); assert k == j;
Ma anche con gli oggetti:
   void f(Object n) {n= new Object;}
   ...
   Object k=new Object; Object j=k; f(k); assert k == j;
-- Dario

 -- Dario
magari non sono stato abbastanza chiaro ma quello che volevo dire è 
dimostrato dal seguente frammento di codice:
-------------------------------------------------------------
package prove;
import java.util.*;
public class PassaggioParametri {
   private static void aggiungi (Vector v){
     v.add("nuovo");
   }
   public static void main(String argv[]) {
     Vector v1=new Vector();
     v1.add("primo");
     System.out.println("nelem:"+v1.size());
     aggiungi(v1);
     System.out.println("nelem:"+v1.size());
   }
}
-------------------------------------------------------------
che se eseguito da come output
nelem:1
nelem:2


ho riletto ancora il mio messaggio,
con la frase "potrebbe ritrovarsi l'oggetto passato come
parametro modificato" non intendevo dire che si ritrova un oggetto 
diverso ma che lo stato dell'oggetto potrebbe essere diverso.
-- 


thanx a tutti
nel mio libro si dice:
"in java tutti i parametri, siano essi numeri od oggetti, sono copiati per
valore"
cio' significa che all'esterno del metodo in cui vengono passati i
parametri, nn vengono modificati???

 magari non sono stato abbastanza chiaro ma quello che volevo dire
..e' che tutto e' passato per valore. Talvolta accade che il valore passato 
sia un riferimento, cioe' un puntatore su cui non si puo' fare aritmetica, 
ma si puo' solo dereferenziare. ;-)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun


| When the method or constructor is invoked (§15.12),
| the values of the actual argument expressions initialize
| newly created parameter variables, each of the declared Type,
| before execution of the body of the method or constructor.
Quindi il passaggio dei parametri in Java e' *sempre* per valore,
qualsiasi sia il tipo (tipi primitivi o Object) delle espressioni usate
nella invocazione del metodo.
-- Dario

samuele wrote:

se sono tipi primitivi no...
se sono handle di oggetti si perchè tu passi per valore il puntatore 
all'oggetto quindi usando quel puntatore modifichi l'oggetto