27

В чем разница между этими 2 кодами: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; 
} 

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

+7

Нет «прохода по ссылке». Это пропуск по значению, а значение является ссылкой. Код B не компилируется, и если бы он не менял myFoo. – harold

ответ

165

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


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

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 НЕ f на объект, его атрибут "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 :)

+15

УДИВИТЕЛЬНОЕ объяснение! Я чувствую себя просветленным! – delita

+10

Святая корова. Об этом спрашивали и много раз отвечали, но это самое сложное и художественное решение, которое я видел. Браво! – duffymo

+0

Можете ли вы противопоставить то, что будет выглядеть как «пройти по ссылке»? Что для меня имеет смысл, так это «pass by value», это передача адреса памяти объекта, на который ссылается f. В ** changeReference **, ** a ** - новая переменная, которая ссылается на один и тот же адрес памяти, изменяя ** значение ** (или ссылаясь на адрес памяти), только изменяет то, что ** a ** указывает на а не ** f **. Если бы это было «пройти по ссылке» **, то f ** получилось бы таким образом ** a = f **, изменив ** значение ** (или адрес ссылки на адрес), изменится ** f ** –

8

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

2

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

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

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

1

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

+0

Нет, в языке нет понятия «изменчивый» или «неизменный». Следовательно, нет никакой разницы в том, как они передаются. «Изменения не отражаются на вашей оригинальной копии». Неизменяемый объект по определению является тем, который не имеет способа «изменить», поэтому это утверждение не имеет смысла. – newacct