Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 50

Ильдар Шаукатович Хабибуллин

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

При обращении к методу создаются локальные переменные для хранения параметров метода на время его работы. Под них выделяются ячейки оперативной памяти, в которые копируются аргументы метода, заданные при обращении к нему. Локальные переменные-параметры существуют только во время выполнения метода, по окончании его работы переменные уничтожаются и память освобождается.

Теория программирования знает несколько способов передачи аргументов в метод. Чаще всего применяются два способа: передача по значению и передача по ссылке.

Если аргумент передается по значению, то он копируется в локальную переменную-параметр метода, созданную во время выполнения метода и существующую только на время его работы. Сам аргумент при этом остается недоступным для метода и, следовательно, не изменяется им.

При передаче по ссылке в метод поступает не сам аргумент, а его адрес. Метод работает не с копией, а непосредственно с аргументом, обращаясь к нему по адресу, переданному в локальную переменную, и изменяет сам аргумент.

В языке Java, как и в языке С, реализован только один способ — передача аргументов по значению. Например, выполнив следующую программу:

class Dummy1{

private static void f(int a){ a = 5;

}

public static void main(String[] args){

int x = 7;

System.out.println(,,До: " + x); f(x);

System.out.println("После: " + x);

}

}

вы увидите значение 7 и до и после выполнения метода f(), потому что он менял локальную переменную a, а не переменную-аргумент x.

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

class Dummy2{

private static void f(int[] a){ a[0] = 5;

}

public static void main(String[] args){ int[] x = {7};

System.out.println("До: " + x[0]); f (x);

System.out.println("После: " + x[0]);

}

}

Теперь переменная x — это ссылка на массив, которая копируется в локальную переменную, созданную для параметра a. Ссылка a направляется на тот же массив, что и ссылка x. Она меняет нулевой элемент массива, и мы получаем "До: 7", "После: 5". По-прежнему сделана передача аргумента по значению, но теперь аргумент — это ссылка, и в метод f () передается ссылка, а не объект, на который она направлена.

Передача ссылок по значению приводит иногда к неожиданным результатам. В следующем примере:

class Dummy3{

private static void f(int[] a){ a = new int[]{5};

}

public static void main(String[] args){ int[] x = {7};

System.out.println("До: " + x[0]); f (x);

System.out.println("После: " + x[0]);