← Назад к вопросам

Как передать параметр по ссылке?

1.2 Junior🔥 141 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Передача параметров по ссылке в Java

В Java нет механизма передачи параметров "по ссылке" в классическом понимании (как в C++ с оператором &). Однако существует важное различие между передачей примитивных типов и ссылочных типов, которое часто называют передачей "по ссылке".

Передача примитивных типов

Примитивные типы (int, long, boolean и т.д.) передаются по значению:

int x = 5;
changeValue(x);
public static void changeValue(int x) {
    x = 10; // Не влияет на оригинальное значение
}

Изменения внутри метода не повлияют на исходную переменную.

Передача ссылочных типов

Объекты и массивы передаются по ссылке (точнее, копируется сама ссылка):

class Person {
    String name;
}

Person person = new Person();
person.name = "Alice";
changePerson(person);
public static void changePerson(Person p) {
    p.name = "Bob"; // Изменит оригинальный объект
}

После вызова changePerson() переменная person будет иметь name = "Bob", так как мы модифицировали тот же объект.

Ограничение: переназначение ссылки

Однако есть важный нюанс - переназначение самой ссылки внутри метода не повлияет на исходную ссылку:

Person person = new Person();
changeReference(person);
// person будет ссылаться на старый объект, не новый

public static void changeReference(Person p) {
    p = new Person(); // Это создаст новый объект
    p.name = "Charlie"; // Не повлияет на исходную ссылку
}

Решение через обертки

Для имитации передачи по ссылке примитивных типов используют обертки (wrapper classes) или контейнерные объекты:

class IntHolder {
    int value;
}

IntHolder holder = new IntHolder();
holder.value = 5;
changeValue(holder);
public static void changeValue(IntHolder holder) {
    holder.value = 10; // Изменит оригинальное значение
}

Заключение

В Java нет явной передачи по ссылке для примитивов, но объекты передаются таким образом, что их поля и состояние можно модифицировать внутри методов. Это мощный механизм, но требует осторожности при проектировании кода.