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

Przekazywanie argumentów do metod

Object Storage Arubacloud
0 głosów
2,592 wizyt
pytanie zadane 21 grudnia 2016 w Java przez rubesom Obywatel (1,690 p.)
edycja 21 grudnia 2016 przez rubesom

Cześć,

Mam problem ze zrozumieniem przekazywania argumentów do metod. Typy proste są dla mnie zrozumiałe - przekazuje je jako wartości (bazuje na innych wartościach - nie zmieniam oryginalnej zmiennej).

Ale z obiektami mam już problem.

Odnosząc się do tego przykładu LINK

A konkretnie to zdanie "Zmieniając argument metody (jego wewnętrzną strukturę), zmieniamy też zewnętrzny obiekt, który został tam przekazany, ale zmieniając referencję parametru metody (na przykład przypisując jej nowy obiekt) nie zmieniamy oryginalnej referencji, a tylko jej kopię."

Mam taki kod:

		public static void main(String[] args) 
	{
	Integer zmienna = new Integer(10);
		System.out.println(zmienna);
		zmiana(zmienna);
		System.out.println(zmienna);
}
	static void zmiana(Integer a)
	{
		++a;
		System.out.println(a);
	}

Myślałem, że jest to przekazanie do metody referencji do zmiennej "zmienna" ale dokonując inkrementacji moja zmienna "zmienna" pozostaje bez zmian (wynosi 10), a operacja w metodzie "zmiana" daje mi wynik 11.

 

Może mi to ktoś w przystępny sposób wytłumaczyć?

komentarz 21 grudnia 2016 przez Avernis Nałogowiec (27,400 p.)
Bo przesyłasz do metody kopie zmiennej. Nie jestem dobry w javie, ale możesz jeśli chcesz przesłać oryginał, to możesz stworzyć tablice 1 elementową, a jako argument daj int a[]
komentarz 21 grudnia 2016 przez rubesom Obywatel (1,690 p.)
Ale patrząc na to stwierdzenie z linku "Zmieniając argument metody (jego wewnętrzną strukturę), zmieniamy też zewnętrzny obiekt, który został tam przekazany" i podany przykład myślałem, że tak wygląda przekazanie przez referencję. Nie wiem gdzie popełniam błąd.

3 odpowiedzi

+2 głosów
odpowiedź 21 grudnia 2016 przez Andrus19 Bywalec (2,260 p.)
edycja 21 grudnia 2016 przez Andrus19

1. Po pierwsze Integer jest immutable podobnie jak String - tzn. że nie zmienisz jego wartości po utworzeniu obiektu. Np. nie możesz zrobić czegoś takiego:

Integer liczba = new Integer(5);
liczba.set(23); //błąd - czegoś takiego nie ma

2. Jeśli chcesz się nauczyć na czym polega przesyłanie referencji utwórz sobie jakąś własną klasę i obiekt tej klasy prześlij do metody, która ją zmodyfikuje. Wtedy zobaczysz że po powrocie z metody obiekt rzeczywiście został zmodyfikowany.

3. Po trzecie gdybyś mógł zmieniać wartość Integera to w twojej metodzie i tak by to się nie udało bo argument jaki przyjmuje twoja metoda jest typu prostego - zwykły int przesłany jako wartość.

To że twój kod zadziałał to zasługa autounboxingu ale tym na razie sobie nie zawracaj głowy tylko sprawdź to co jest w punkcie 2. ;)

+1 głos
odpowiedź 21 grudnia 2016 przez Kornelia Kobiela Nałogowiec (33,340 p.)

Twoja metoda zmiana przyjmuje jako argument typ prosty. W ten sposób obiekt niejako jest konwertowany na typ prosty. 

Obrazek dla ułatwienia

0 głosów
odpowiedź 21 grudnia 2016 przez MichuDev Pasjonat (20,300 p.)

Przeczytaj to uważnie, szczególnie punkt 4. Nawet kilka razy: 

  1. W Javie wszystko co dziedziczy po klasie java.lang.Object jest obiektem, są również typy prymitywne np. int, float, double, boolean, long, short, byte, char, które nie dziedziczą po klasie java.langObject.
  2. W Javie obiekty wewnętrzne oraz obiekty przekazywane do metod są przekazywane przez referencję czyli wskaźnik, jest to odwołanie do miejsca w pamięci gdzie się ten obiekt znajduje. 
  3. Od Javy 5 typy prymitywne są automatycznie opakowywane w obiekty gdy jest taka potrzeba i odpakowywane, przez co gdy metoda wymaga typu Object, a my mamy int, typ zmienia się na typ Integer (opakowanie obiektowe dla typu int). 
  4. Z drugiej strony jak metoda wymaga typu int, a my damy Integer, typ zostanie odpakowany na typ int. Więc zostanie on skopiowany (typy prymitywne przekazujemy przez wartość). Jeśli go nie zwracamy to wynik jest taki jaki jest! 
komentarz 22 grudnia 2016 przez rubesom Obywatel (1,690 p.)

Dla uściślenia mojej wiedzy. Ten kod:

    public static void main(String[] args) 
    {
    Integer zmienna = new Integer(10);
        System.out.println(zmienna);
        zmiana(zmienna);
        System.out.println(zmienna);
}
    static void zmiana(Integer a)
    {
        ++a;
        System.out.println(a);
    }

Pomimo tego, że w metodzie użyłem

Integer a

to ta zmienna w tym przypadku jest odpakowywana jako typ prosty?

komentarz 22 grudnia 2016 przez MichuDev Pasjonat (20,300 p.)
Podczas każdej operacji na wartości (dodawanie, inkrementacja, mnożenie, dzielenie, modulo, zmiana wartości...).

W twoim przypadku Integer odpakowuje się na int (obiektTypuInteger.intValue()), następnie inkrementuje liczbę. Następnie wyświetla (11 linia), i przekazuje sterowanie do metody main.

Podobne pytania

0 głosów
2 odpowiedzi 309 wizyt
pytanie zadane 9 maja 2017 w Java przez rubesom Obywatel (1,690 p.)
0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 1 lipca 2020 w Java przez kasia7777 Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 925 wizyt
pytanie zadane 7 listopada 2017 w C i C++ przez antek782 Początkujący (490 p.)

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 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!

...