Читать «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]);