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:pass-by-value
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ę ;]