Java pass by reference


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

Код А:

Foo myFoo;
myFoo = createfoo();

Где

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

Против Кода B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}
Есть ли какие-либо различия между этими двумя частями кодов?
4 28

4 ответа:

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

    Введите описание изображения здесь

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

    public static void changeReference(Foo a)
    

    Введите описание изображения здесь

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

    Введите описание изображения здесь

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

    Foo b = new Foo("b");
    

    Введите описание изображения здесь

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

    Введите описание изображения здесь


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

    Введите описание изображения здесь

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

    Введите описание изображения здесь

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

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

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

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

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

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