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

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

Код A:

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

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

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

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

  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 переназначает ссылку NOT 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 

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

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

  • В чем разница между методом и функцией?
  • Что такое reflection и почему оно полезно?
  • Что такое самоуверенное программное обеспечение?
  • Инверсия управления <Инъекция зависимостей
  • В чем разница между деревом parsingа и АСТ?
  • ?? Null Coalescing Operator -> Что означает коалесцирование?
  • Что такое определения, декларации и назначения C ++?
  • В чем разница между пространством ядра и пользовательским пространством?
  • Разница между DTO, VO, POJO, JavaBeans?
  • В чем разница между персонажем, точкой кода, глифом и графемой?
  • Статический / Динамический против Сильного / Слабый
  • Давайте будем гением компьютера.