Java передать по ссылке - PullRequest
       68

Java передать по ссылке

30 голосов
/ 23 февраля 2012

В чем разница между этими 2 кодами:

Код A:

Foo myFoo;
myFoo = createfoo();

, где

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

Vs.Код B:

Foo myFoo;
createFoo(myFoo);

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

Есть ли различия между этими двумя кодами?

Ответы [ 4 ]

186 голосов
/ 23 февраля 2012

Java всегда передает аргументы по значению, НЕ по ссылке.


Позвольте мне объяснить это на примере :

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

Я объясню это вшаги:

  1. Объявление ссылки с именем f типа Foo и назначение ее новому объекту типа Foo с атрибутом "f".

    Foo f = new Foo("f");
    

    enter image description here

  2. Со стороны метода объявляется ссылка типа Foo с именем a, которая первоначально присваивается null.

    public static void changeReference(Foo a)
    

    enter image description here

  3. При вызове метода changeReference ссылка a будет присвоена объекту, который передается в качестве аргумента.

    changeReference(f);
    

    enter image description here

  4. Объявление ссылки с именем b типа Foo и назначение ее новому объекту типа Foo с атрибутом"b".

    Foo b = new Foo("b");
    

    enter image description here

  5. a = b переназначает ссылку a NOT f на объект, чей атрибутis "b".

    enter image description here


  6. При вызове метода modifyReference(Foo c) создается ссылка c, которая присваивается объекту с атрибутом "f".

    enter image description here

  7. c.setAttribute("c"); изменит атрибут объекта, на который указывает ссылка c, и тот же объект, на который указывает ссылка f.

    enter image description here

Надеюсь, теперь вы понимаете, как передача объектов в качестве аргументов работает в Java:)

9 голосов
/ 23 февраля 2012

Поскольку Java строго «передается по значению» и даже ссылки на объекты передаются по значению, второй код не будет работать должным образом. См. «Связанный» раздел справа для многочисленных обсуждений по этому вопросу.

2 голосов
/ 23 февраля 2012

Думайте о параметрах метода как о своей собственной переменной объявлений .Если бы вы заменили вызов метода одним блоком кода, он выглядит следующим образом:

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

Даже если параметр метода имеет то же имя, что и другая переменная, параметр метода все еще остается собственным,уникальная ссылка, о которой знает только метод.Это то же самое, что говорит Энг.Фуад выше.

1 голос
/ 23 февраля 2012

Еще один важный момент, который вы должны знать, это тип объекта, который вы передаете в метод.будь то изменчивый объект или неизменный объект.Если вы передадите неизменный объект, такой как String, он создаст другую копию и выполнит модификацию.Изменения не отражены в вашей оригинальной копии.

...