Wpis z mikrobloga

@dog_meat: w javie w większości operujesz na typach referencyjnych i to nalezy wiedzieć od początku pisania w tym języku. Różnica między java a c++ jest taka, że w javie domyślna jest referencja i operujemy na niej bez dodatkowych oznaczeń wskaźników jak to ma miejsce w c++

Także, nie wiem gdzie i jak ten gif jest mylący bo nie jest.
  • Odpowiedz
@dog_meat: @statoscope: W Javie przekazujesz zawsze przez wartość. Różnica polega na tym, że w Javie poslugujesz się wartością referencji.

Ta nazwa bierze się tylko stąd, że Java nie używa nazwy wskaźnika jak C++, a łączy przejście z adresu pamięci do wyluskania wartości pod danym adresem. Dopóki nie wywolasz metody na referencji, to wygląda to jak wskaźnik i zachowuje się jak wskaźnik. Wywołanie przez notację z kropką od razu wyluskuje wartość i wywołuje metodę - dlatego przed wywołaniem trzeba się bronić przed NullPointerException (ktoś powiedział pointer!?). W C++ masz rozgraniczenie na wskaźnik (adres + wartość lub null) i referencje (już zainicjalizowany obszar pamięci zachowujący się jak zwykły obiekt). Java najwyraźniej chciała zrobić to podobnie, ale inaczej :)
  • Odpowiedz
  • 1
@rzuf22 taka różnica między pass by object (Java) vs pass by reference: gdyby do zmiennej do której jest przypisany argument metody fillCup przypisać czerwony kubek to w pierwszym przypadku zmienna na zewnątrz będzie dalej wskazywała na biały kubek. W drugim przypadku będzie on czerwony
  • Odpowiedz
@rzuf22: no o tym właśnie pisałem. A gof jest mylący dla kogoś, kto nie zdaje sobie sprawy że obiekty na których operuje są naprawdę referencjami. Wtedy ktoś przeczytawszy, że w Javie zawsze przekazujemy przez wartość, będzie myślał, że może przekazać bezpiecznie filiżankę, napełnić ją wewnątrz metody, a na zewnątrz pozostanie pusta
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@bolinoga: @dog_meat: @Saly: @rzuf22: @statoscope: a jest jakaś sprytna metoda w javie przekazywania samej filiżanki? Z tego co pamiętam yo jak kiedyś pisałem najprościej było stworzyć metodę obj.clone() który zwraca nowy obiekt ze skopiowanymi wartościami. Niestety jeśli wewnątrz tego obiektu mamy jakieś inne obiekty jako wartości to też trzeba na nich .clone() albo coś podobnego stworzyć.. Nie ma ładniejszego rozwiązania?
  • Odpowiedz
@sorek: nie da się. Możesz ewentualnie posiłkować się wrapowaniem argumentów w inny obiekt, wtedy zmiany bedą widoczne, ale to nie jest wygodne. Z tego powodu java nie ma funkcji swap tak jak np. cpp.
  • Odpowiedz
@Saly: tworzę nową klasę: class CupHolder {Cup cup;}, której instancję przekazuję do metody. Dzięki temu jak ktoś zmieni pole cup w ten instancji to będziemy mieli zachowanie podobne jak w call by reference.
  • Odpowiedz