Java pass by reference
Jaka jest różnica pomiędzy tymi 2 kodami:
Kod A:
Foo myFoo;
myFoo = createfoo();
Gdzie
public Foo createFoo()
{
Foo foo = new Foo();
return foo;
}
Vs. Kod B:
Foo myFoo;
createFoo(myFoo);
public void createFoo(Foo foo)
{
Foo f = new Foo();
foo = f;
}
Czy są jakieś różnice między tymi 2 kawałkami kodów?
4 answers
Java zawsze przekazuje argumenty przez wartość, a nie przez odniesienie.
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");
}
}
Wyjaśnię to w krokach:
-
Deklarowanie referencji o nazwie
f
typuFoo
i przypisywanie jej do nowego obiektu typuFoo
z atrybutem"f"
.Foo f = new Foo("f");
-
Od strony metody deklarowane jest odniesienie typu
Foo
o nazwiea
i jest ono początkowo przypisane donull
.public static void changeReference(Foo a)
-
Podczas wywoływania metody
changeReference
, odniesieniea
zostanie przypisane do obiektu przekazywanego jako argument.changeReference(f);
-
Deklarowanie referencji o nazwie
b
typuFoo
i przypisywanie jej do nowego obiektu typuFoo
z atrybutem"b"
.Foo b = new Foo("b");
-
a = b
ponownie przypisuje referencjęa
, a nief
obiektowi, którego atrybutem jest"b"
.
-
Podczas wywoływania metody
modifyReference(Foo c)
, tworzony jest Referencjac
i przypisywana do obiektu z atrybutem"f"
. -
c.setAttribute("c");
zmieni atrybut obiektu, który Referencjac
wskazuje na niego, i jest to ten sam obiekt, który Referencjaf
wskazuje na niego.
Mam nadzieję, że teraz rozumiesz, jak przekazywanie obiektów jako argumentów działa w Javie:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44
Ponieważ Java jest ściśle "pass by value" i nawet odwołania do obiektów są przekazywane przez wartość, drugi kod nie będzie działał zgodnie z oczekiwaniami. Zobacz sekcję "powiązane" po prawej stronie dla licznych dyskusji na ten temat.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 23:06:18
Traktuj parametry metody jako własną zmienną deklaracje . Jeśli chcesz zastąpić wywołanie metody pojedynczym blokiem kodu, wygląda to tak:
Foo myFoo;
{ //Method call starts here
Foo foo;
foo = myFoo;
Foo f = new Foo();
foo = f;
} //Method call ends here
Nawet jeśli parametr metody ma taką samą nazwę jak inna zmienna, parametr metody jest nadal własnym, unikalnym odniesieniem, o którym wie tylko metoda. To samo co Eng.Fouad mówi wyżej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 00:05:55
Kolejnym ważnym punktem, który powinieneś znać, jest typ obiektu, który PRZEKAZUJESZ do metody. czy jest to obiekt zmienny czy niezmienny. Jeśli przekażesz obiekt niezmienny, taki jak String, utworzy on kolejną kopię i dokona modyfikacji. Zmiany nie są odzwierciedlane w oryginalnej kopii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 00:18:11