pamiętnik programisty

02 mar, 2009

Pass-By-Value w Javie

Zamieszczony przez: pejotr w: Java|Programowanie

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ę ;]

4 odpowiedzi na "Pass-By-Value w Javie"

1 | Wojtek

24. Marzec 2009 o 00:31

Avatar

+1 do mojej wiedzy :-) pozdro

2 | Jarek Przygódzki

25. Marzec 2009 o 15:03

Avatar

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).

3 | pejotr

28. Marzec 2009 o 11:12

Avatar

@Up, dokładnie tak jest, ale tak przecież napisałem :)

4 | .NET słowa kluczowe out,ref | pamiętnik programisty

8. Maj 2010 o 11:24

Avatar

[...] wykonane na takim obiekcie pozostają aktualne po zakończeniu metody, o czym napisałem we wpisie Pass-by-value w javie. Dla przypomnienia: tak naprawdę przekazywana jest nie referencja a jej kopia, z tego powodu [...]

Formularz komentarza

*

O mnie:

pejotrWitam, 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.

Kategorie