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ę ;]
Witam, nazywam się Piotr Doniec, w internecie występuję pod nickami 'pejotr' oraz 'doniczek'. Obecnie jestem studentem 3 roku informatyki na Politechnice Warszawskiej na wydziale Elektroniki i Technik Informacyjnych.