JavaRush /Blog Java /Random-PL /Przekazywanie parametrów w Javie
vincent_vega
Poziom 24
Gainesville

Przekazywanie parametrów w Javie

Opublikowano w grupie Random-PL
Zmienna w Javie to kontener zawierający wartość. Co więc oznacza „przekazanie” zmiennej? Jaka jest różnica między pierwotnymi i referencyjnymi typami danych.
Przekazywanie parametrów w Javie - 1
Dojdziemy do tego później. Zacznijmy najpierw od prostego zadania. Co robi ten kod:
int х = 3;
int у = х;
W linii 1 tworzona jest zmienna x typu int, której przypisuje się wartość 3. W linii 2 tworzona jest zmienna y typu int, której przypisuje się wartość zmiennej x . W przyszłości zmienna x nie będzie w żaden sposób wpływać na y . Java kopiuje wartość x (3) i umieszcza tę kopię w y . Jest to przekazywanie parametru przez wartość. Nie zapisujesz jednej zmiennej do drugiej. Wartość zostanie skopiowana i przypisana do nowej zmiennej. Wyrażenie y = x; NIE oznacza „zapisz x do y ”. Oznacza to „skopiuj wartość wewnątrz x i zapisz tę kopię w y ”. Jeśli później zmienię y :
у = 34;
Czy to wpłynie na x ? Oczywiście nie. x nadal ma wartość 3. Jeśli zmienię x później :
х = 90;
Jak to wpłynie na ciebie ? Nie ma mowy. Po dokonaniu przypisania nie są one w żaden sposób powiązane (KOPIOWANIE wartości). A co z typami referencyjnymi? Jak oni pracują? Nie jest to takie trudne, właściwie zasada jest taka sama. Linki robią to samo - otrzymujesz kopię linku. Więc jeśli powiem:
Cat A = new Cat ();
Cat B = A;
Łącze A jest kopiowane do łącza B. Nie dotyczy to obiektu – nadal masz tylko jeden obiekt. Ale teraz masz dwa różne odniesienia kontrolujące ten sam obiekt Cat . Przyjrzyjmy się teraz przekazywaniu parametrów do metod. Java przekazuje parametry według wartości. Zawsze. Oznacza to „skopiuj wartość i przekaż kopię”. W przypadku typów prymitywnych jest to łatwe:
int х = 5;
doStuff (х); / / Передать копию х (oznaczający 5) в метод doStuff
Metoda doStuff wygląda następująco:
void doStuff (int у) {

   / / Действия с 'y'
}
Kopia wartości x , czyli 5, przekazywana jest do metody doStuff() . Metoda doStuff() ma własną zmienną o nazwie y . Zmienna y jest nową, inną zmienną. Z kopią tego, co było w x w momencie przekazania go do metody. Od tej chwili y i x nie mają na siebie żadnego wpływu. Kiedy zmieniasz y , nie wpływasz na x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
I odwrotnie – jeśli zmienisz x , nie zmienisz y . Jedyne, co zrobił x w tym przypadku, to skopiował jego wartość i przekazał ją do metody doStuff() . Jak działa „przekazywanie wartości” z referencjami? Zbyt wiele osób twierdzi, że „Java przekazuje typy pierwotne według wartości, a obiekty przez referencje”. To nie jest to, co mówią. Java przekazuje wszystko według wartości. W przypadku prymitywów otrzymujesz kopię treści. Dzięki linkom otrzymujesz także kopię treści. Ale jaka jest treść linku? Pilot. Udogodnienia umożliwiające zarządzanie/dostęp do obiektu. Przekazując odwołanie do obiektu do metody, przekazujesz kopię odniesienia. Klon pilota. Obiekt nadal leży na stosie, na którym został stworzony i czeka, aż ktoś użyje pilota. Obiektowi jest obojętne ile pilotów jest „zaprogramowanych” do sterowania nim. Jedynymi ludźmi, którzy się tym przejmują, są śmieciarz i ty, programista. Więc kiedy powiesz:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Jest tylko jeden obiekt Kot . Ale teraz dwa piloty (łącza) mogą uzyskać dostęp do tego samego obiektu Cat . Zatem teraz cokolwiek B zrobi z obiektem Cat , wpłynie to na Cat wskazanego przez A , ale nie wpłynie to na zawartość A ! Możesz zmienić Cat używając nowego linku B (skopiowanego bezpośrednio z A ), ale nie możesz zmienić A. Co to do cholery oznacza? Możesz zmienić obiekt, do którego odnosi się A , ale nie możesz zmienić odniesienia A - przekierować go do innego obiektu lub null . Jeśli więc zmienisz odniesienie do B (nie rzeczywisty obiekt Cat , do którego odwołuje się B , ale wartość samego odniesienia) , nie zmienisz wartości A. I wzajemnie. Więc:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Oznacza to po prostu, że B wskazuje na inny obiekt. A jest nadal szczęśliwy. Powtarzaj więc za mną: Java przekazuje wszystko według wartości. (OK, jeszcze raz... z wyczuciem.) Java przekazuje wszystko według wartości. W przypadku typów pierwotnych przekazujesz kopię bieżącej wartości, w przypadku odniesień do obiektów przekazujesz kopię odniesienia (zdalne sterowanie). Nigdy nie mijasz obiektu. Wszystkie obiekty są przechowywane na stercie. Zawsze. Teraz zaparz solidną filiżankę kawy i napisz trochę kodu! Oryginalny artykuł.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION