27

Qual è la differenza tra questi 2 codici:passaggio Java con riferimento

Codice A:

Foo myFoo; 
myFoo = createfoo(); 

dove

public Foo createFoo() 
{ 
    Foo foo = new Foo(); 
    return foo; 
} 

vs. Codice B:

Ci sono differenze tra questi 2 codici?

+7

Non c'è "pass per riferimento" lì. Passa per valore e il valore è un riferimento. Il codice B non viene compilato e, se lo fosse, non cambierebbe myFoo. – harold

risposta

165

Java passa sempre argomenti per valore NON per riferimento.


Mi spiego questo attraverso un example:

public class Main 
{ 
    public static void main(String[] args) 
    { 
      Foo f = new Foo("f"); 
      changeReference(f); // It won't change the reference! 
      modifyReference(f); // It will modify the object that the reference variable "f" refers to! 
    } 
    public static void changeReference(Foo a) 
    { 
      Foo b = new Foo("b"); 
      a = b; 
    } 
    public static void modifyReference(Foo c) 
    { 
      c.setAttribute("c"); 
    } 
} 

farò spiegare questo in passi:

  1. Dichiarare un riferimento di nome f di tipo Foo e assegnarlo a un nuovo oggetto del tipo Foo con un attributo "f".

    Foo f = new Foo("f"); 
    

    enter image description here

  2. Dal lato metodo, un riferimento di tipo Foo con un nome a viene dichiarato ed è inizialmente assegnato a null.

    public static void changeReference(Foo a) 
    

    enter image description here

  3. Come si chiama il metodo changeReference, il riferimento a verrà assegnato all'oggetto che viene passato come argomento.

    changeReference(f); 
    

    enter image description here

  4. Dichiarazione un riferimento denominato b di tipo Foo e assegnare a un nuovo oggetto di tipo Foo con un attributo "b".

    Foo b = new Foo("b"); 
    

    enter image description here

  5. a = b è riassegnazione riferimento a NON f all'oggetto cui l'attributo è "b".

    enter image description here


  6. Come si chiama modifyReference(Foo c) metodo, viene creato un riferimento c e assegna all'oggetto con attributo "f".

    enter image description here

  7. c.setAttribute("c"); cambierà l'attributo dell'oggetto che fanno riferimento c punti ad esso, ed è allo stesso oggetto che fanno riferimento f punti ad esso.

    enter image description here

Spero che tu capisca ora come passare oggetti come argomenti lavora in Java :)

+15

spiegazione IMPRESSIONANTE! Mi sento illuminato! – delita

+10

Mucca santa. Questo è stato chiesto e risposto molte volte, ma questa è la soluzione più elaborata e artistica che abbia mai visto. Bravo! – duffymo

+0

Riesci a mettere in contrasto ciò che sarebbe "pass per riferimento"? Ciò che ha senso per me è con "passa per valore", sta passando l'indirizzo di memoria dell'oggetto a cui fa riferimento f. In ** changeReference **, ** a ** è una nuova variabile che si riferisce allo stesso indirizzo di memoria, cambiando il valore di ** a ** (o riferito all'indirizzo di memoria) cambia solo ciò che ** a ** indica e non ** f **. Se fosse "passa per riferimento" ** f ** sarebbe passato in modo che ** a = f **, cambiando il valore di ** a ** (o indirizzo di memoria a cui fare riferimento) cambierebbe ** f ** –

8

Poiché Java è strettamente "passa per valore" e anche i riferimenti agli oggetti vengono passati per valore, il secondo codice non funzionerà come previsto. Vedere la sezione "Correlati" a destra per numerose discussioni su questo.

2

Pensate a parametri di metodo come le proprie variabili dichiarazioni. Se si dovesse sostituire la chiamata di metodo con un unico blocco di codice, sembra che questo:

Foo myFoo; 
{      //Method call starts here 
    Foo foo; 
    foo = myFoo; 
    Foo f = new Foo(); 
    foo = f; 
}      //Method call ends here 

Anche se il parametro metodo ha lo stesso nome di un'altra variabile, il parametro del metodo è ancora un proprio, unico riferimento che solo il metodo conosce. Questa è la stessa cosa che Eng.Fouad dice sopra.

1

Un altro punto importante da conoscere è il tipo di oggetto che si passa al metodo. se si tratta di un oggetto mutevole o di un oggetto immutabile. Se passi un oggetto immutabile come String, creerà un'altra copia ed eseguirà la modifica. Le modifiche non si riflettono sulla tua copia originale.

+0

No, non esiste un concetto di "mutevole" o "immutabile" nella lingua. Non vi è quindi alcuna differenza nel modo in cui sono passati. "Le modifiche non si riflettono sulla tua copia originale." Un oggetto immutabile, per definizione, è uno che non ha alcun metodo per "cambiare", quindi questa affermazione non ha senso. – newacct