• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java pass by value

Object Storage Arubacloud
0 głosów
685 wizyt
pytanie zadane 20 lutego 2019 w Java przez periedynek Obywatel (1,320 p.)

Cześć. Mam pytanie odnośnie tego, że Java jest przekzywana przez wartość.

Mam dwa przzykłady z SO:

public class Main{
     public static void main(String[] args){
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a){
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c){
          c.setAttribute("c");
     }
}

Tutaj wszystko rozumiem w changeReference tworzymy nową referencję, dlatego nie działamy na tym samym adresie.

Ten obrazek to pokazuje:

I mam drugi kod:

private void foo(Object bar) {
    bar = null;
}

public static void main(String[] args) {
    String baz = "Hah!";
    foo(baz);
    System.out.println(baz);
}

W metodzie foo nie tworzymy żadnych nowych instancji, dlatego dlaczego nie wypiszę się null tylko Hah?

Czy to nie jest taka sama metoda jak modifyReference z 1 przykładu?

1
komentarz 20 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
W drugim przykladzie bar jest zmienna referencyjna ktora wskazuje na ten sam adres co baz. Ale gdy nullujesz wartosc bar to poprostu tracisz informacje o adresie tego obiektu, a nie zmieniasz jego wartosc.

3 odpowiedzi

+3 głosów
odpowiedź 20 lutego 2019 przez RafalS VIP (122,820 p.)
        String baz = "Hah!";
        Object bar = baz;
        bar = null;
        System.out.println(baz);

Robisz coś takiego.

komentarz 21 lutego 2019 przez periedynek Obywatel (1,320 p.)
No tak, tutaj jasno widać, że są to dwa różne obiekty. Ale są to dwa różne obiekty, z tego względu, że jedno to jest kopia drugiego.

Nie rozumiem dalej, dlaczego w 1 zmieniamy,a w drugim nie (w 1 oczywiście rozumiem dladczego tak się dzieje i jest to logiczne).

Jeżeli miałbys rozpisać 1 przykład w taki sam sposób jak rozpisałeś to jakby on wyglądał?
komentarz 21 lutego 2019 przez RafalS VIP (122,820 p.)
        Foo f = new Foo("f");
        //changeReference(f); :
        Foo a = f;
        Foo b = new Foo("b");
        a = b;
        //modifyReference(f); :
        Foo c = f;
        c.setAttribute("c");

 

+1 głos
odpowiedź 20 lutego 2019 przez Asertywny Mądrala (5,430 p.)
edycja 20 lutego 2019 przez Asertywny
Przekazujesz obiekt typu string (by value!) do funkcji foo.

Funkcja foo przypisuje do swojej kopii (by value!) tej referencji inną wartość.

Funkcja foo dokonała zmian tylko w swojej kopii tej referencji (Jeszcze raz - przekazano argument BY VALUE, dlatego działa na kopii), a następnie wychodzi ze swojego bloku i ta zmiana nie jest nigdzie zapisana.
komentarz 21 lutego 2019 przez periedynek Obywatel (1,320 p.)
To jest nielogicznie przecież :/ W tym i w tym coś zmieniam. W 2 przypadku jeżeli były jakieś dane to są one teraz wszystkie nullami.
komentarz 21 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
No nie. Nie traktuj referencji do obiektu jako obiekt. Referencja to jest adres. Jak pozbedziesz sie adresu to nie oznacza ze obiekt przestaje istniec.
1
komentarz 21 lutego 2019 przez periedynek Obywatel (1,320 p.)

Może jeszcze inaczej. 

Czy patrząc na ten obrazek, który zamieściłem w pytaniu i patrząc na 2 przykład, to czy obrazek w 2 przykładzie by wyglądał tak:

1. Przed linijką z metody. 2 Po linijce z bar=null

1
komentarz 21 lutego 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Tak
komentarz 21 lutego 2019 przez periedynek Obywatel (1,320 p.)

W takim razie, dzieki wielkieheart

0 głosów
odpowiedź 21 lutego 2019 przez Arkadiusz Fajdek Dyskutant (9,450 p.)
Hej! Java zawsze jest "pass by value", można by się tutaj naprawdę rozpisać na ten temat, jednak bardzo dobrym postem który wyjaśnia ten temat jest wpis na niezawodnym stack overflow;) https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
komentarz 21 lutego 2019 przez periedynek Obywatel (1,320 p.)
wlasnie stamtad sa te przyklady

Podobne pytania

0 głosów
1 odpowiedź 822 wizyt
0 głosów
1 odpowiedź 446 wizyt
0 głosów
1 odpowiedź 125 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...