Java luôn luôn pass-by-value — không có pass-by-reference.
Điểm gây nhầm: với object, thứ được copy là giá trị của reference (địa chỉ trỏ đến object), không phải bản thân object.
java
void change(User u) {
u.setName("B"); // OK: ảnh hưởng caller — u trỏ CÙNG object
u = new User("C"); // BAD: không ảnh hưởng — chỉ gán lại BẢN COPY của reference
}Hệ quả:
- Method sửa được trạng thái object của caller (vì 2 reference cùng trỏ 1 object).
- Method không đổi được biến của caller trỏ đi đâu — gán lại tham số chỉ đổi bản copy → viết swap(a, b) đổi chỗ 2 object là bất khả thi trong Java.
- Với primitive, copy giá trị thuần → mọi thay đổi trong method đều không ảnh hưởng caller.
Trả lời gọn: "Java pass-by-value; với object thì value đó là reference — nên mutate được object, nhưng không reassign được biến của caller."