Параметри методу java

При виклику методу аргументи передаються "за значенням". Іншими словами, значення змінних-параметрів в тілі методу - це копії тих об'єктів, які код-ініціатор передав методу у вигляді аргументів. Якщо, наприклад, метод отримує в якості аргументу значення типу doublе, в тілі методу відповідний параметр зберігає копію значення, і можливі зміни цієї копії в процесі роботи методу жодним чином не впливають на вміст змінних в коді-ініціатора. Розглянемо наступний приклад:

class PassByValue

public static void main (String [] args)

Sуstеm.оut.println ( "до: оnе =" + оnе);

Sуstеm.оut.println ( "після: оnе =" + оnе);

public static void halveIt (double arg)

arg / = 2.0; // Розділити значення arg навпіл

sуstеm.оut.println ( "половина: arg =" + arg);

нижче показаний результат роботи програми - операція ділення значення Параметра arg в методі halveIt не впливає на вміст змінної оnе в тілі методу main.

половина: arg = 0.5

class PassRef

public static void main (String [] args)

Body venus = new Body ( "Beнepa", null);

Sуstеm.оut.ргintln ( "до:" + venus);

Sуstеm.оut.ргintln ( "після:" + venus);

public static void CommonName (Body bodyRef)

bodyRef.name = "ранкова зірка";

Результат роботи програми виглядає так:

Після: 0 (Ранкова зірка)

Зверніть увагу, що стан "зовнішнього" стосовно методу CommonName об'єкта піддалося зміні "зсередини" цього методу; крім того, змінна venus все ще зберегла посилання на той же об'єкт класу Body, а в методі CommonName копія bodyRef посилальної змінної venus отримала інше значення - null. Все це, зрозуміло, вимагає більш докладного роз'яснення.

Наступна діаграма ілюструє стан змінних безпосередньо після виклику з main методу СommonName.

У цей момент дві змінні, venus в main і bodyRef в commonName, вказують на один і той же об'єкт. Коли метод commonName вносить зміну в поле bodyRef.name, модифікується вміст того ж об'єкта, загального для двох довідкових змінних. Коли ж commonName привласнює змінної bodyRef значення null, змінюється тільки вміст самої змінної bodyRef; стан посилання venus залишається колишнім, оскільки параметр bodyRef - це копія змінної venus, передана в якості аргументу за значенням. Єдиний елемент даних, який в останньому випадку піддається впливу, - це параметр bodyRef як такої (те ж спостерігалося і в попередньому прикладі, коли єдиною "постраждалої" стороною в процесі роботи методу halveIt опинявся параметр arg). Якби зміна bodyRef впливало на значення venus в main, рядок після. виводиться на екран, містила б слово null. Що стосується першої операції присвоювання в тілі методу commonName (bodyRef. Name = ...), слід повторити ще раз: на один і той же об'єкт одночасно вказують обидві змінні, venus в main і bodyRef в commonName, тому зміни, що вносяться до стан об'єкта за допомогою посилання bodyRef, будуть видимі і при зверненні до об'єкта за допомогою інших існуючих посилань (зокрема, venus).

Існує наскільки поширене, настільки ж і невірне судження про те, що об'єкти Java нібито передаються "за посиланням". В теорії мов програмування досить уживаний термін передача за посиланням, строго кажучи, означає наступне: коли аргумент передається в функцію, викликана функція отримує посилання на вихідне значення, але не копію цього значення. Якщо в тілі функції значення параметра змінюється, відповідні дані в коді, який ініціював виклик, також піддаються зміни, оскільки аргумент і параметр вказують на один і той же блок пам'яті. Якби мова Java в дійсності дозволяв використовувати аргументи, що передаються по посиланню, існували б способи оголосити метод halveIt так, щоб його внутрішній код міг змінити значення зовнішньої змінної оnе, і дозволити методу СommonName змінити значення змінної venus на null. Але зробити це неможливо. В Java об'єкти не передаються по посиланню - посилання па об'єкти передаються за значенням. Оскільки дві копії однієї і тієї ж посилальної змінної вказують на один об'єкт, будь-які зміни в стані об'єкту, вироблені за допомогою однієї посилання, будуть "видимі" за допомогою іншого. Існує єдиний спосіб передачі аргументів (за значенням), і це дозволяє значно спростити життя.

Схожі статті