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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top