Domanda

Se ho una variabile membro come questa (dichiarata nel corpo di una classe)

private Dot[] dots=new Dot[numDots];

Eseguo il ciclo attraverso tutti i membri di questo array e:

1) Passa ogni oggetto Dot a una funzione di un'altra classe, che:

2) Passa a un'altra funzione di una terza classe, se sono soddisfatte alcune condizioni

3) E la 3a classe modifica alcune proprietà dell'oggetto Dot

quindi quando questo oggetto viene restituito alla classe originale / parent, tali modifiche alle sue proprietà verranno mantenute? O verrebbe trattato come una variabile locale dalle funzioni 2nd / 3rd?

È stato utile?

Soluzione

Sì, le modifiche alle proprietà vengono mantenute. Java è 100% pass-by-value, tuttavia, quando si passa un oggetto, il "valore" passato è veramente un puntatore all'oggetto. Pertanto, quando cambi un oggetto in un metodo, stai cambiando l'oggetto reale passato.

Cioè, se hai il seguente metodo, il metodo chiamante vedrà le modifiche:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

ma se fai quanto segue, il metodo di chiamata non vedrà le modifiche.

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

Nel secondo esempio, il chiamante non vedrà eventuali modifiche e non vedrà l'oggetto Dot appena creato.

Altri suggerimenti

Gli oggetti sono passati da [ riferimento valore dove il valore è il riferimento ] (cose che ereditano dall'oggetto), valori primitivi (int, long, double, ecc. ) vengono passati per valore.

Ciò significa che quando una primitiva viene passata da un chiamante al metodo viene copiata, mentre con un oggetto viene passato un [ valore del ] riferimento.

Il che a sua volta significa che quando un oggetto viene mutato da un metodo, il chiamante vede quei cambiamenti perché ha un riferimento allo stesso oggetto.

Al contrario, quando un metodo muta una primitiva, il chiamante non vede le modifiche mentre il metodo sta lavorando su una copia.

[motivo delle modifiche]

Se Java avesse passato il riferimento, allora potresti farlo:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

dove foo è definito come:

void foo(Object o)
{
   o = new Float(43);
}

Poiché Java passa il riferimento per valore o = new Float (43); è consentito - ma il valore nel chiamante rimarrà come new Integer (42);

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