Java pass by reference

Jaka jest różnica pomiędzy tymi 2 kodami:

Kod A:

Foo myFoo;
myFoo = createfoo();

Gdzie

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

Vs. Kod B:

Foo myFoo;
createFoo(myFoo);

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

Czy są jakieś różnice między tymi 2 kawałkami kodów?

Author: shA.t, 2012-02-23

4 answers

Java zawsze przekazuje argumenty przez wartość, a nie przez odniesienie.


Wyjaśnię to na przykładzie :

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

Wyjaśnię to w krokach:

  1. Deklarowanie referencji o nazwie f typu Foo i przypisywanie jej do nowego obiektu typu Foo z atrybutem "f".

    Foo f = new Foo("f");
    

    Tutaj wpisz opis obrazka

  2. Od strony metody deklarowane jest odniesienie typu Foo o nazwie a i jest ono początkowo przypisane do null.

    public static void changeReference(Foo a)
    

    Tutaj wpisz opis obrazka

  3. Podczas wywoływania metody changeReference, odniesienie a zostanie przypisane do obiektu przekazywanego jako argument.

    changeReference(f);
    

    Tutaj wpisz opis obrazka

  4. Deklarowanie referencji o nazwie b typu Foo i przypisywanie jej do nowego obiektu typu Foo z atrybutem "b".

    Foo b = new Foo("b");
    

    Tutaj wpisz opis obrazka

  5. a = b ponownie przypisuje referencję a, a nie f obiektowi, którego atrybutem jest "b".

    Tutaj wpisz opis obrazka


  6. Podczas wywoływania metody modifyReference(Foo c), tworzony jest Referencja c i przypisywana do obiektu z atrybutem "f".

    Tutaj wpisz opis obrazka

  7. c.setAttribute("c"); zmieni atrybut obiektu, który Referencja c wskazuje na niego, i jest to ten sam obiekt, który Referencja f wskazuje na niego.

    Tutaj wpisz opis obrazka

Mam nadzieję, że teraz rozumiesz, jak przekazywanie obiektów jako argumentów działa w Javie:)

 177
Author: Eng.Fouad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44

Ponieważ Java jest ściśle "pass by value" i nawet odwołania do obiektów są przekazywane przez wartość, drugi kod nie będzie działał zgodnie z oczekiwaniami. Zobacz sekcję "powiązane" po prawej stronie dla licznych dyskusji na ten temat.

 8
Author: A.H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 23:06:18

Traktuj parametry metody jako własną zmienną deklaracje . Jeśli chcesz zastąpić wywołanie metody pojedynczym blokiem kodu, wygląda to tak:

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

Nawet jeśli parametr metody ma taką samą nazwę jak inna zmienna, parametr metody jest nadal własnym, unikalnym odniesieniem, o którym wie tylko metoda. To samo co Eng.Fouad mówi wyżej.

 2
Author: Mutant Platypus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 00:05:55

Kolejnym ważnym punktem, który powinieneś znać, jest typ obiektu, który PRZEKAZUJESZ do metody. czy jest to obiekt zmienny czy niezmienny. Jeśli przekażesz obiekt niezmienny, taki jak String, utworzy on kolejną kopię i dokona modyfikacji. Zmiany nie są odzwierciedlane w oryginalnej kopii.

 1
Author: Eshan Sudharaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 00:18:11