Java проходит по ссылке

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

Код 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;
}

Существуют ли различия между этими двумя частями кодов?

Ответ 1

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


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

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

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

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

    Foo f = new Foo("f");
    

    enter image description here

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

    public static void changeReference(Foo a)
    

    enter image description here

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

    changeReference(f);
    

    enter image description here

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

    Foo b = new Foo("b");
    

    enter image description here

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

    enter image description here


  • Как вы называете метод modifyReference(Foo c), создается и назначается ссылка c объекту с атрибутом "f".

    enter image description here

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

    enter image description here

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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