Pass-By-Value w Javie
Mimo że Java jest uznawana za uproszczoną i okrojoną wersję C++ to są w niej kruczki których bez koniecznej wiedzy rozwiązać się nie da. Sposób przekazywania argumentów do metod jest szczególnie kłopotliwy dla początkujących w Javie. Ja mimo że sądziłem że trochę się z językiem już zaznajomiłem, brzydko mówiąc „naciąłem” się na teście sprawdzającym wiedzę z zakresu podstaw OO właśnie na pytaniu z przekazywaniem parametrów.
Kod wyglądał tak:
class A {
public int a = 1;
public String b = "a";
}
public class B {
private static void aMethod(A a) {
a.a = 2;
a.b = "b";
a = new A();
}
public static void main(String[] args) {
A a = new A();
aMethod(a);
System.out.println(a.a+" "+a.b);
}
}
Pamiętałem że tylko typy wbudowane są przekazywane przez wartość a pozostałe, dziedziczące po Object, już przez referencję. Ale okazało się że się trochę pomyliłem. Java owszem przekazuje referencję do metody, ale jest to tylko kopia oryginalnej referencji ! Dlatego można zmienić zawartość pól tak przekazanego obiektu, ale próba przestawienia referencji gdzieś indziej nie powiedzie się ! Graficznie można to przedstawić tak:
Robiąc a = new A(); w aMethod(…) przestawiamy tylko kopię referencji, a dokonane wcześniej zmiany będą widoczne w instancji ‘a’ po opuszczeniu metody.
Do tego pomyłka w pytaniu czy wszystkie klasy mają klasę bazową.A no mają Object, tylko że Object juz po niczym nie dziedziczy, głupia pomyłka… Ale mimo wszystko żółty pas jest i widoczny na pierwszej stronie www.javablackbelt.com przez najbliższe 24h będę ;]
| Drukuj artykuł | Ten wpis został napisany przez pejotr na 02-03-2009 o 14:24, i jest w kategorii Java, Programowanie. Podążaj za odpowiedziami do tego wpisu przez RSS 2.0. Możesz napisać komentarz, lub trackbacka z Twojej własnej strony. |
około 1 lat temu
+1 do mojej wiedzy
pozdro
około 1 lat temu
W Javie WSZYSTKO przekazywane jest przez wartość. Obiekty nie są przekazywane WCALE. Przekazywane są tylko rerefencje do obiektów, i to przekazywane przez wartość. (by-value).
około 1 lat temu
@Up, dokładnie tak jest, ale tak przecież napisałem