Шаг 29.
Язык программирования Java.
Параметры методов

На этом шаге мы поговорим про параметры методов

Рассмотрим термины, которые употребляются для описания способа передачи параметров методам (или функциям) в языках программирования. Термин вызов по значению означает, что метод получает значение, переданное ему из вызываеющей части программы. Вызов по ссылке означает, что метод получает из вызывающей части программы местоположение переменной. Таким образом, метод может видоизменить значение переменной, передаваемой по ссылке, но не переменной, передаваемой по значению.

В Java всегда используется только вызов по значению. Это означает, что метод получает копии значений всех своих параметров. По этой причине метод не может видоизменить содержимое ни одной из переменных, передаваемых ему в качестве параметров. Рассмотрим первый пример:

public static void tripleValue(int x) {
	x = 3 * x;
}
...
double percent = 10;
tripleValue (percent);

После вызова метода значение переменной percent по-прежнему останется равным 10. В данном примере происходит следующее:

  1. Переменная x инициализируется копией значения параметра percent (то есть числом 10).
  2. Значение переменной x утраивается, и теперь оно равно 30. Но значение переменной percent по прежнему остается равным 10.
  3. Метод завершает свою работу, и его переменный параметр x больше не используется.

Как было показано выше, методы не могут видоизменить параметры примитивных типов. Совсем иначе дело обстоит с объектами. Рассмотрим второй пример:

public static void tripleSalary(Employee x) {
	x.raiseSalary (200);
}
...
Employee harry = new Employee (...);
tripleSalary (harry);

При выполнении данного фрагмента кода происходят следующие действия:

  1. Переменная x инициализируется копией значения переменной harry, то есть ссылкой на объект.
  2. Метод raiseSalary() применяется к объекту по этой ссылке. В частности, объект типа Employee, доступный по ссылкам x и harry, получает сумму зарпаты сотрудников, увеличенную на 200%.
  3. Метод, завершает свою работу, и его параметр x больше не испоьзуется. Переменная harry продолжает ссылаться на объект, в котором зарплата увеличена в трое.

Такие изменения происходят по простой причине: метод получает копию ссылки на объект, поэтому копия и оригинал ссылки указывают на один и тот же объект.

Некоторые программисты утверждают, что в Java при передаче объектов используется только вызов по ссылке. Но это совсем не так. Для того чтобы понять почему это утвержение ошибочно, обратимся к третьему примеру:

public static void swap(Employee x, Employee y) {
	Employee temp = x;
	x = y;
	y = temp;
}
...
Employee a = new Employee ("Alice",  ...);
Employee b = new Employee ("Bob",  ...);
swap (a, b);

В данном примере используется метод для обмена двух объектов. По завершении работы данного метода переменные x и y уничтожаются, а исходные переменные a и b продолжают ссылаться на прежние объекты. Таким образом, в Java для передачи объектов не применяется вызов по ссылке. Вместо этого ссылки на объекты передаются по значению.

Ниже описано, что может и что не может делать метод со своими параметрами:

На следующем шаге мы поговорим об инициализации полей

Предыдущий шаг Содержание Следующий шаг