Perchè il mio metodo Java non può cambiare una variabile passata? [duplicare]
-
28-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
ero un po 'perplesso quando ho visto il seguente codice non ha funzionato come previsto.
Ho pensato Java variabili passate sempre da riferimenti in funzioni. Quindi, perché non può riassegnare la funzione della variabile?
public static void main(String[] args) {
String nullTest = null;
setNotNull(nullTest);
System.out.println(nullTest);
}
private static void setNotNull(String s) {
s = "not null!";
}
Questo programma uscite null
.
Soluzione
I riferimenti agli oggetti sono passati per valore in Java in modo da assegnare alla variabile locale all'interno del metodo non cambia la variabile originale. Solo i punti variabile s
locali per una nuova stringa. Potrebbe essere più facile da capire con un po 'di arte ASCII.
Inizialmente si dispone di questo:
------------
| nullTest |
------------
|
null
La prima volta che entra nel metodo di setNotNull si ottiene un copia del valore di nullTest in s
. In questo caso il valore di nullTest è riferimento null:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null null
s quindi riassegnare:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null "not null!"
E poi lasciare il metodo:
------------
| nullTest |
------------
|
null
Altri suggerimenti
Java pretende passare riferimento, passa il valore del riferimento. Quando si assegnano s="not null"
, si sta riassegnando tale valore.
speravo di fare qualcosa di simile setNotNull (MyObject o) senza utilizzare o = setNotNull (o)
Semplicemente, non si può. Il più vicino si ottiene è qualcosa di simile:
public class MyRef<T> {
private T obj;
public T get() {
return obj;
}
public void set(T obj) {
this.obj = obj;
}
public void setNotNull(T obj) {
if (this.obj == null) {
this.obj = obj;
}
}
}
MyRef<MyObj> ref = new MyRef<MyObj>();
ref.setNotNull(xyz);
System.err.println(ref.get());
che è tutto piuttosto goffo, e probabilmente non vale la pena.
s =
questo è il motivo. si assegnano a s, senza modificare l'oggetto che s punti.