Назад к вопросам
Junior
67
questionbank
В чем заключается разница между передачей объекта по ссылке и по значению?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Java объекты всегда передаются по значению. Это значение — копия ссылки на объект в памяти.
Передача по значению:
- Передается копия значения переменной.
- Для примитивных типов (int, boolean, float и т.д.) передается копия самого значения. Изменение копии не влияет на оригинал.
- Для ссылочных типов (объекты, массивы) передается копия ссылки на объект в памяти. Обе ссылки указывают на один и тот же объект. Изменение состояния объекта (например, вызов сеттера) через любую из ссылок будет видно через другую. Однако, если одной из ссылок присвоить новый объект, это не повлияет на объект, на который ссылается другая ссылка.
Передача по ссылке (в Java отсутствует):
- Передается сама ссылка на переменную или объект.
- Изменение значения переменной или объекта через переданную ссылку приведет к изменению исходного значения.
Пример с объектом:
// Пример с объектом
class MyObject {
int value;
MyObject(int value) {
this.value = value;
}
}
public class Main {
public static void changeObjectValue(MyObject obj) {
obj.value = 100; // Изменяет состояние объекта, на который указывает obj
}
public static void reassignObjectReference(MyObject obj) {
obj = new MyObject(200); // Изменяет ссылку obj внутри метода, не влияет на исходную ссылку
}
public static void main(String[] args) {
MyObject originalObject = new MyObject(10);
System.out.println("Original value before changeObjectValue: " + originalObject.value); // 10
changeObjectValue(originalObject);
System.out.println("Original value after changeObjectValue: " + originalObject.value); // 100
MyObject anotherObject = new MyObject(30);
System.out.println("Another value before reassignObjectReference: " + anotherObject.value); // 30
reassignObjectReference(anotherObject);
System.out.println("Another value after reassignObjectReference: " + anotherObject.value); // 30
}
}
Пример с примитивным типом:
// Пример с примитивным типом
public class Main {
public static void changePrimitiveValue(int num) {
num = 50; // Изменяет копию 'num' внутри метода
}
public static void main(String[] args) {
int originalNum = 10;
System.out.println("Original num before changePrimitiveValue: " + originalNum); // 10
changePrimitiveValue(originalNum);
System.out.println("Original num after changePrimitiveValue: " + originalNum); // 10
}
}