Java supporta davvero il passaggio per riferimento?Java passa per riferimento?
In caso contrario, perché abbiamo l'operatore == per trovare due oggetti con lo stesso riferimento?
Java supporta davvero il passaggio per riferimento?Java passa per riferimento?
In caso contrario, perché abbiamo l'operatore == per trovare due oggetti con lo stesso riferimento?
Java utilizza passaggio per valore, non con riferimento ...
Ma, per i tipi primitivi non il valore è il valore di riferimento.
Quindi == confronta i valori dei riferimenti per gli oggetti.
Ma a livello di codice byte ha riferimento ... giusto? https://en.wikipedia.org/wiki/Java_bytecode –
Java non utilizza pass-by-reference ma piuttosto pass-by-value. I parametri del valore primitivo sono copiati nello stack, oltre a puntatori agli oggetti.
L'operatore ==
deve essere utilizzato per confrontare i valori primitivi e per confrontare i riferimenti agli oggetti.
Per una spiegazione dettagliata, vedere il mio articolo "Java è Pass-By-Value, Dannazione!"
Questa è la risposta migliore e corretta. – Maladon
risposta breve è no. In Java esiste solo il valore pass-by e quando si lavora con gli oggetti (ad esempio Object obj = new Object();
), si lavora con i riferimenti agli oggetti. Che vengono passati per valore.
Per ulteriori dettagli, si veda: Parameter passing in Java
Il punto di distinzione è tra "pass ** - sottoprodotti riferimento" e "pass ing riferimento **". A volte vedi anche "call-by -..." e "pass-by -..." usati in modo intercambiabile. Per semplicità, rimarrò con "pass-by -...".
In accademica, vecchia scuola, FORTRAN rilevanti, la terminologia comp-sci, passaggio per riferimento significa che il codice di chiamata ha accesso (di riferimento) per una variabile passata dal chiamante. Assegnare al parametro formale nel codice chiamato esegue effettivamente un assegnamento alla variabile del chiamante. La distinzione è versus (tra gli altri) pass-by-value, che fornisce al codice richiamato una copia dei dati (qualunque essa sia) nota al chiamante.
Nel contemporaneo mondo OO pertinente, "avere un riferimento" a un oggetto significa essere in grado di raggiungere l'oggetto stesso. Questo si distingue da "avere un puntatore" per enfatizzare (tra le altre cose) che non si fa "puntatore aritmetico" su un riferimento. (In realtà, un "riferimento" in questo senso non deve necessariamente essere un indirizzo reale puntatore come la memoria.)
Java passa gli argomenti per valore (nel primo senso), ma per gli argomenti oggetto, il valore è un riferimento (nel secondo senso). Ecco un po 'di codice che si basa sulla differenza.
// called
public void munge(List<String> a0, List<String> a1) {
List<String> foo = new List<String>(); foo.add("everybody");
a0.set(0, "Goodbye");
a1 = foo;
}
// caller
...
List<String> l0 = new List<String>(); l0.add("Hello");
List<String> l1 = new List<String>(); l1.add("world");
munge(l0, l1);
...
Al ritorno dal munge
, prima lista del chiamante, l0
conterrà "Goodbye"
. Un riferimento a tale elenco è stato passato a munge
, che ha chiamato un metodo di muting su tale oggetto designato.(In altre parole, a0
ricevuto un copia del valore della l0
, che è stato un un elenco di stringhe riferimento a che ha ottenuto modificato.)
Tuttavia, al ritorno da munge
, seconda lista del chiamante, l1
ancora contiene "world"
perché non è stato chiamato alcun metodo sul riferimento oggetto passato (il valore di l1
, è passato dal valore a munge
). Invece, la variabile argomento a1
è stata impostata su un nuovo valore (il riferimento all'oggetto locale anche tenuto in foo
).
IF Java aveva usato passaggio per riferimento, poi al ritorno, l1
sarebbe contenuta "everybody"
perché a1
sarebbe sottoposto alla variabilel1
e non semplicemente stato inizializzato a una copia del suo valore. Quindi l'assegnazione a a1
sarebbe stata anche assegnata a l1
.
Questo stesso problema è stato discusso in another question, con ASCII-art per illustrare la situazione.
Chiamare per riferimento e passare per riferimento sono la stessa cosa, giusto? In caso contrario, qualcuno può cambiare la domanda a quello che era. –
Java supporta il passaggio di copie di riferimenti (non i riferimenti originali), in modo che qualsiasi modifica sui riferimenti all'interno del metodo non venga riflessa all'esterno. Controlla questo: [Java - passa per riferimento o passa per valore] (http://programmergate.com/java-pass-reference-pass-value/) –