Ответ
В Java все параметры передаются в методы строго по значению (pass-by-value). Не существует передачи по ссылке (pass-by-reference). Это фундаментальное правило языка.
Что это значит на практике:
- Для примитивных типов (int, double, boolean, char и др.) в метод передается копия самого значения. Изменение параметра внутри метода не влияет на оригинальную переменную.
- Для ссылочных типов (объекты, массивы) в метод передается копия ссылки (адреса объекта в памяти). Через эту копию можно изменять состояние объекта, но нельзя изменить саму оригинальную ссылку (например, присвоить ей новый объект).
Пример 1: Примитивный тип (передача копии значения)
void modifyPrimitive(int x) {
x = 100; // Меняем локальную копию
System.out.println("Inside method: x = " + x); // 100
}
public static void main(String[] args) {
int number = 5;
modifyPrimitive(number);
System.out.println("After method: number = " + number); // 5 (не изменилось)
}
Пример 2: Ссылочный тип (передача копии ссылки)
class MyObject {
String value;
}
void modifyReference(MyObject obj) {
obj.value = "Changed"; // Меняем состояние объекта по копии ссылки
obj = new MyObject(); // Переназначаем локальную копию ссылки на новый объект
obj.value = "New";
}
public static void main(String[] args) {
MyObject original = new MyObject();
original.value = "Original";
modifyReference(original);
System.out.println(original.value); // "Changed" (состояние изменилось!)
// Но сама переменная `original` по-прежнему ссылается на старый объект.
}
Итог:
- Нельзя изменить ссылку исходной переменной на объект извне метода.
- Можно изменить состояние объекта, на который эта ссылка указывает.
- Это поведение часто описывают как "передача ссылки по значению".
Ответ 18+ 🔞
А, слушай, смотри, тут такая тема, про которую новички постоянно ебут мозг друг другу и сами себе. В Java, блядь, все параметры в методы передаются строго по значению (pass-by-value). Передачи по ссылке (pass-by-reference) тут, нахуй, нет и не было. Это как аксиома, прими и не спорь, иначе пиздец.
Что это значит на практике, для нас, простых смертных:
- Примитивы (int, boolean и прочая хуйня): В метод летит копия циферки или булевки. Поменял внутри — ну, поменял свою копию. Оригиналу на это похуй, он как был, так и остался.
- Объекты и массивы (ссылочные типы): Тут хитрее, блядь. Передаётся копия ссылки (адреса этой хрени в памяти). По этой копии ты можешь лезть внутрь объекта и менять там всё, что захочешь. Но! Саму оригинальную ссылку (то есть переменную снаружи) ты переприсвоить не сможешь. Это как дали тебе дубликат ключа от квартиры: мебель внутри передвинуть — пожалуйста, а вот поменять замок и сказать, что теперь ключ открывает другую квартиру — хуй ты, это ж копия ключа, а не сам ключ.
Пример 1: Примитив (копия значения, всё просто)
void modifyPrimitive(int x) {
x = 100; // Меняем свою локальную копию
System.out.println("Inside method: x = " + x); // 100
}
public static void main(String[] args) {
int number = 5;
modifyPrimitive(number);
System.out.println("After method: number = " + number); // 5 (оригинал не тронут, ёпта!)
}
Пример 2: Объект (копия ссылки, тут веселее)
class MyObject {
String value;
}
void modifyReference(MyObject obj) {
obj.value = "Changed"; // А вот это работает! Лезу по копии ссылки внутрь и меняю состояние.
obj = new MyObject(); // А вот это нихуя не работает снаружи! Переназначил свою локальную копию ссылки.
obj.value = "New"; // Работает только внутри метода для нового объекта.
}
public static void main(String[] args) {
MyObject original = new MyObject();
original.value = "Original";
modifyReference(original);
System.out.println(original.value); // Будет "Changed"! Состояние-то поменяли!
// Но сама переменная `original` всё ещё тыкает в тот же старый объект, а не в новый.
}
Итог, блядь:
- Поменять саму ссылку (куда смотрит внешняя переменная) из метода — нельзя, нахуй.
- Изменить содержимое объекта, на который эта ссылка указывает — можно, запросто.
- Вот это всё умные дяди называют "передача ссылки по значению". Звучит как пиздопроебибна, но если вникнуть — логично, ёпта.