A której części nie rozumiesz? Jakikolwiek argument metody w Javie jest jedynie kopią
i w ogóle nie ma sensu rozróżniać tu typu prostego od referencji do obiektów za bardzo. Popatrz na to z perspektywy pamięci komputera.
public void increaseRandomly(double x) { // Nie zadziała
double amount = x * generator.nextDouble();
x += amount;
}
//
double zmienna = 1.0;
increaseRandomly(zmienna);
Zmienna zmienna
siedzi w pamięci pod adresem np. 0x1337, podczas gdy parametr x
metody increaseRandomly
jest jedynie kopią i leży pod adresem 0x1234. Więc zmiana tego x
powoduje zmiany w pamięci pod adresem 0x1234 i nijak sie to ma do wartości pod adresem 0x1337.
Jeśli weźmiemy teraz referencje do obiektów, to w praktyce te referencje przechowują po prostu... adres w pamięci gdzie leży dany obiekt! Popatrzmy na drugi przykład:
public void replaceWithZombie(Employee e) {
e = new Employee("", 0);
}
//
Employee janusz = new Employee("janusz",69);
EvilManager.replaceWithZombie(janusz);
Znowu patrzymy jak to wygląda w pamięci. Pod adresem 0x1337 mamy obiekt Employee. Po adresem 0xCAFE mamy referencje janusz
która przechowuje wartość 0x1337 (czyli zna adres obiektu w pamięci). Kiedy wywołamy replaceWithZombie
to zmienna e
w tej funkcji będzie np. pod adresem 0xBABE i będzie przechowywać wartość 0x1337 (bo to kopia naszej referencji janusz
, jest w innym miejscu w pamięci ale ma tą samą wartość). Jeśli zmienisz teraz wartość pod 0xBABE na 0x7331 gdzie umieściłeś tego nowego Employee, to widać że nijak się to ma do naszego początkowego obiektu pod 0x1337 i nijak się to ma do naszej zmiennej janusz pod 0xCAFE.
Słowno-muzyczna analogia: Wyobraź sobie ze napisałem ci na kartce swój adres. Jeśli ty teraz zmienisz ten adres na kartce, to wcale nie sprawia ze ja sie nagle przeprowadziłem ;) Idąc dalej analogią kartki, jeśli skserujesz tą moją kartkę i dasz koledze i ten kolega zmieni adres na swojej kserówce to znowu ani nie sprawi to że ja sie przeprowadzę, ani też nie sprawi ze adres na twojej oryginalnej kartce ulegnie zmianie :) Ale mając kartkę z adresem mozesz podjechać mi pod dom i wybić okna!
Adres kartka = new Adres(...);
kartka.wybijOkna(); // ok
kartka = new Adres(...) // ja się wcale nie przeprowadzam