Java passa per riferimento

Qual è la differenza tra questi 2 codici:

Codice A:

Foo myFoo; myFoo = createfoo(); 

dove

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

Vs. Codice B:

 Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; } 

Ci sono delle differenze tra questi 2 pezzi di codici?

    Java passa sempre argomenti per valore NON per riferimento.


    Lasciatemi spiegare questo attraverso un esempio :

     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"); } } 

    Lo spiegherò nei passaggi:

    1. Dichiarare un riferimento denominato f di tipo Foo e assegnarlo a un nuovo object di tipo Foo con un attributo "f" .

       Foo f = new Foo("f"); 

      inserisci la descrizione dell'immagine qui

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

       public static void changeReference(Foo a) 

      inserisci la descrizione dell'immagine qui

    3. Quando chiami il metodo changeReference , il riferimento a verrà assegnato all’object che viene passato come argomento.

       changeReference(f); 

      inserisci la descrizione dell'immagine qui

    4. Dichiarare un riferimento denominato b di tipo Foo e assegnarlo a un nuovo object di tipo Foo con un attributo "b" .

       Foo b = new Foo("b"); 

      inserisci la descrizione dell'immagine qui

    5. a = b sta riassegnando il riferimento a NOT f all’object il cui attributo è "b" .

      inserisci la descrizione dell'immagine qui


    6. Quando chiamate il modifyReference(Foo c) , viene creato un riferimento c viene assegnato all’object con l’attributo "f" .

      inserisci la descrizione dell'immagine qui

    7. c.setAttribute("c"); cambierà l’attributo dell’object di riferimento c punta ad esso, ed è lo stesso object a cui fa riferimento f .

      inserisci la descrizione dell'immagine qui

    Spero che tu capisca ora come funzionano gli oggetti come oggetti in Java 🙂

    Poiché Java è rigorosamente “passa per valore” e anche i riferimenti agli oggetti vengono passati per valore, il secondo codice non funzionerà come previsto. Vedi la sezione “Related” a destra per numerose discussioni su questo.

    Pensa ai parametri del metodo come alle proprie dichiarazioni variabili. Se dovessi sostituire la chiamata al metodo con un singolo 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 method ha lo stesso nome di un’altra variabile, il parametro method è ancora il proprio, riferimento univoco che solo il metodo conosce. Questa è la stessa cosa che Eng.Fouad dice sopra.

    Un altro punto importante che dovresti sapere è il tipo di object che passi nel metodo. se si tratta di un object mutevole o di un object immutabile. Se passi un object immutabile come String, creerà un’altra copia ed eseguirà la modifica. Le modifiche non si riflettono sulla tua copia originale.