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 change 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
NOT f
на объект, атрибут которого "b"
.
6- Как вы звоните modifyReference(Foo c)
встретилисьоднако, ссылка c
создается и присваивается объекту с атрибутом "f"
.
7- c.setAttribute("c");
изменит атрибут объекта, на который ссылается c
указывает на него, и тот же объект, на который указывает ссылка f
.
Надеюсь, вы теперь понимаете, как передача объектов в качестве аргументов работает в Java:)