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

Глава 7. Методы и классы 167

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

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

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

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

class Test { , <

void methtint i, int j) { i *= 2; '

j /= 2; } }

class CallByValue {

public static void main(String args[]) {t 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 -

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

168 Часть I. Язык Java

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

// Объекты передаются по ссылке. 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