Ответ 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");
-
Со стороны метода объявляется ссылка типа
Foo
с именемa
и она первоначально назначаетсяnull
.public static void changeReference(Foo a)
-
Как вы вызываете метод
changeReference
, ссылкаa
будет назначена объекту, который передается как аргумент.changeReference(f);
-
Объявление ссылки с именем
b
типаFoo
и присвоение ее новому объекту типаFoo
с атрибутом"b"
.Foo b = new Foo("b");
-
a = b
переназначает ссылкуa
NOTf
объекту, чей атрибут"b"
. -
Как вы называете метод
modifyReference(Foo c)
, создается и назначается ссылкаc
объекту с атрибутом"f"
. -
c.setAttribute("c");
изменит атрибут объекта, на который указывает ссылкаc
, и указывает на него тот же объект, что и ссылкаf
.
Надеюсь, теперь вы понимаете, как объекты передачи в качестве аргументов работают в Java:)