Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
12.05.2015
Размер:
624.64 Кб
Скачать

Передача аргументов

Вообще, существуют два способа, с помощью которых машинный язык мо­жет передавать аргумент подпрограмме. Первый способ – передача аргу­мента по значению. Этот метод копирует значение аргумента в формальный параметр подпрограммы. Поэтому любые изменения этого параметра под­программой не имеют никакого влияния на соответствующий аргумент вы­зова. Второй способ – передача аргумента по ссылке. В этом методе ссылка на параметр (а не его, значение) передается параметру. Внутри подпрограммы она используется, чтобы обратиться к фактическому параметру, указанному в вызове. Это означает, что изменения параметра будут влиять на аргумент, использованный для вызова подпрограммы. Java использует оба метода, в зависимости от того, что передается во время вызова подпрограмме.

Когда методу передается простой тип, он передается по значению. Таким об­разом, то, что происходит с параметром, который принимает аргумент, ни­как не влияет на сам аргумент (т. е. аргумент при этом не изменяется). На­пример, рассмотрим следующую программу:

// Простые типы передаются по значению.

class Test {

void meth(int i, int j) {

i *= 2;

j /= 2;

}

}

class CallByValue {

public static void main(String args[]) {

Test ob = new Test();

int a = 15, b = 20;

System.out.println("а и b перед вызовом: " + a + " " + b);

ob.meth(a, b);

System.out.println("а и b после вызова: " + a + " " + b);

}

}

Вывод этой программы:

а и b перед вызовом: 15 20

а и b после вызова: 15 20

Как видите, операции, 'которые происходят внутри meth(), никак не влияют на значения а и ь, используемые в вызове (их значения здесь не изменялись до 30 и 10, хотя метод meth() и выполнил соответствующие вычисления над своими параметрами).

Когда вы передаете методу объект, ситуация драматически изменяется, по­тому что объекты передаются по ссылке. Имейте в виду, что при создании переменной типа "класс", вы создаете только ссылку на объект. Таким обра­зом, когда вы передаете эту ссылку методу, принимающий ее параметр будет ссылаться на тот же самый объект, что и аргумент. Это и означает, что объ­екты передаются методам по ссылке. Все изменения объекта внутри метода затрагивают объект, используемый как аргумент. Например, рассмотрим следующую программу:

// Объекты передаются по ссылке.

class Test {

int a, b;

Test(int i, int j) {

b = j;

}

// передать объект

void meth(Test o) {

o.a *= 2;

o.b /= 2;

}

}

class CallByRef {

public static void main (String args [ ] ) {

Test ob = new Test (15, 20);

System.out.println ("ob.а и ob.b перед вызовом: " + ob.a + " " + ob.b);

ob.meth (ob);

System.out.println ("ob.a и ob.b после вызова: " + ob.a + " " + ob.b);

}

}

Эта программа генерирует следующий вывод:

ob.a и ob.b перед вызовом: 15 20

ob.a и ob.b после вызова: 30 10

Не трудно заметить, что в этом случае действия внутри meth() воздействова­ли на объект, используемый как аргумент.

Интересно отметить, что при передаче объектной ссылки методу сама ссыл­ка передается по значению. Однако, т. к. передаваемое значение ссылается на объект, копия этого значения будет ссылаться на тот же объект, что и соответствующий аргумент.

Простые типы передаются методу по значению, а объекты – по ссылке.

Соседние файлы в папке JavaLit