JavaRush /Java блог /Random UA /Передача параметрів у Java
vincent_vega
24 рівень
Gainesville

Передача параметрів у Java

Стаття з групи Random UA
Змінна Java - це контейнер, зі значенням в ньому. То що означає передати змінну? І яка різниця між примітивними та посилальними типами даних.
Передача параметрів у Java - 1
Ми дістанемося до цього пізніше. Давайте спочатку почнемо з простого присвоєння. Що робить цей код:
int х = 3;
int у = х;
У рядку 1 створюється змінна x типу int і їй присвоюється значення 3. У рядку 2 створюється змінна y типу int і їй присвоюється значення змінної x . Надалі змінна x ніяк не впливає на y . Java копіює значення х (3) і поміщає цю копію в у . Це передача параметра за значенням. Ви не записуєте одну змінну до іншої. Значення копіюється і надається нової змінної. Вираз у = х; НЕ означає "записати x у y ". Воно означає "скопіювати значення всередині х і записати цю копію в уЯкщо пізніше я зміню y :
у = 34;
Чи вплине це на x ? Звичайно, ні. x як і раніше має значення 3. Якщо пізніше зміню х :
х = 90;
Як це відіб'ється на y ? Ніяк. Вони не пов'язані після того, як було зроблено присвоєння (КОПІРУВАННЯ значення). А що щодо посилальних типів? Як вони працюють? Не так вже й складно, насправді це правило те саме. Посилання роблять те саме - ви отримуєте копію посилання. Отже, якщо я говорю:
Cat A = new Cat ();
Cat B = A;
Посилання А копіюється на посилання B . До об'єкта це не стосується - у вас як і раніше один об'єкт. Але тепер у вас є дві різні посилання, що контролюють один і той же об'єкт Cat . Тепер розглянемо передачу параметрів у методи. Java передає параметри за значенням. Завжди. Це означає "скопіювати значення і передати копію." Для примітивних типів це легко:
int х = 5;
doStuff (х); / / Передать копию х (значення 5) в метод doStuff
Метод doStuff виглядає так:
void doStuff (int у) {

   / / Действия с 'y'
}
Копія значення x , тобто 5, передається в метод doStuff () . Метод doStuff () має власну змінну, яка називається y . Змінна y - нова, інша змінна. З копією того, що було в х на момент передачі в метод. З цього моменту, у них не впливають один на одного. При зміні у , ви не торкаєтеся х .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
І навпаки - при зміні х , ви не зміните y . Єдине, що зробив x у цій справі, це скопіював своє значення і передав його в метод doStuff() . Як "передача за значенням" працює із посиланнями? Занадто багато людей говорять, "Java передає примітивні типи за значенням, а об'єкти за посиланням". Це не так, як кажуть. Java передає все за значенням. З примітивами ви отримуєте копію вмісту. З посиланнями ви також отримуєте копію вмісту. Але що таке посилання? Пульт дистанційного керування. Засоби для керування/доступу до об'єкта. Коли ви надсилаєте посилання на об'єкт у метод, ви передаєте копію посилання. Клон пульта дистанційного керування. Об'єкт все ще сидить у купі, де був створений, чекаючи когось, щоб використали пульт. Об'єкт не турбує скільки пультів "запрограмовані" щоб контролювати його. Це хвилює лише збирача сміття і вас, програміста. Тому, коли ви кажете:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Існує лише один об'єкт Cat . Але тепер два пульта управління (посилання) можуть отримати доступ до одного і того ж об'єкта Cat . Так що тепер все, що B робить об'єкту Cat , вплине на Cat , на який вказує A , але це не вплине на вміст A ! Ви можете змінити Cat , використовуючи нове посилання B (скопійоване безпосередньо з А ), але ви не можете змінити А . Якого біса це означає? Ви можете змінити об'єкт, на який посилається А , але ви не можете взяти та змінити посилання А- Переадресаувати її на інший об'єкт або null . Так що якщо ви зміните посилання B (не сам об'єкт Cat , на який посилається B , а саме значення посилання) ви не зміните значення А . І навпаки. Так що:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Це просто означає, що Вказує на інший об'єкт. А, як і раніше, щаслива. Тож повторюйте за мною: Java передає все за значенням. (Добре, ще раз... з почуттям.) Java передає все за значенням. Для примітивних типів – ви передаєте копію поточного значення, для посилань на об'єкти – ви надсилаєте копію посилання (дистанційного керування). Ви ніколи не передаєте об'єкт. Усі об'єкти зберігаються у купі. Завжди. Тепер заваріть здоровенну чашку кави та пишіть код! Оригінал статті.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ