Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
29 Мар 2023
2 мин
2536

Java: передача по значению или по ссылке?

Часто встречается заблуждение о том, что Java использует передачу по ссылке. Возможно, это происходит из-за некоторых особенностей языка, которые могут

Часто встречается заблуждение о том, что Java использует передачу по ссылке. Возможно, это происходит из-за некоторых особенностей языка, которые могут вводить в заблуждение. Давайте разберемся подробнее.

Передача по значению и передача по ссылке

В программировании существуют два основных способа передачи данных между функциями или методами: передача по значению и передача по ссылке.

Передача по значению означает, что когда мы передаем переменную в функцию, фактически передается копия значения этой переменной. Это означает, что изменения, которые происходят с переменной внутри функции, не влияют на исходное значение.

void updateValue(int value) {
    value = 50;
}

public static void main(String[] args) {
    int value = 30;
    updateValue(value);
    System.out.println(value);  // Выводит: 30
}

Передача по ссылке, наоборот, означает, что передается ссылка на переменную, а не ее значение. Изменения, которые происходят с переменной внутри функции, влияют на исходное значение.

void updateValue(int[] value) {
    value[0] = 50;
}

public static void main(String[] args) {
    int[] value = {30};
    updateValue(value);
    System.out.println(value[0]);  // Выводит: 50
}

Java и передача параметров

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

Когда мы передаем объект в метод, Java передает значение ссылки на этот объект, а не саму ссылку. Это означает, что метод работает с копией ссылки, а не с оригинальной ссылкой. Изменения, которые происходят с объектом, влияют на исходный объект, потому что копия ссылки все равно указывает на тот же объект. Однако если мы попытаемся изменить саму ссылку (например, присвоить ей новый объект), эти изменения не будут видны за пределами метода.

void updateObject(Foo foo) {
    foo.setValue(50);
    foo = new Foo(100);
}

public static void main(String[] args) {
    Foo foo = new Foo(30);
    updateObject(foo);
    System.out.println(foo.getValue());  // Выводит: 50
}

Таким образом, можно сказать, что Java использует «передачу по значению ссылки», что в некотором смысле является комбинацией передачи по значению и передачи по ссылке.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий