Hỗ trợ Java truyền theo giá trị (luôn hoạt động trên bản sao) nhưng khi bạn chuyển đối tượng do người dùng xác định thì nó sẽ thay đổi đối tượng thực tế (loại truyền theo tham chiếu nhưng không thay đổi con trỏ) hiểu nhưng tại sao phương thức changeObject2CLEAR dưới đây thực sự thay đổi giá trị của đối tượng? Thay vào đó nó phải làm việc trên bản sao?Vấn đề với việc truyền theo giá trị trong java
import java.util.HashMap;
import java.util.Map;
public class PassBy {
class CustomBean {
public CustomBean() {
}
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id + ", " + name;
}
}
public Map<Integer, String> changeObject2NULL (Map<Integer, String> m) {
m = null;
return m;
}
public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
m.clear();
return m;
}
public CustomBean changeCustomObject (CustomBean _e) {
_e.setId(_e.getId() + 1);
return _e;
}
public static void main(String[] args) {
PassBy passby = new PassBy();
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "value");
CustomBean bean = passby.new CustomBean();
bean.setId(1);
bean.setName("arun");
// Initial Value
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println("-------------------------");
// Pass by value works fine
passby.changeObject2NULL(map);
passby.changeCustomObject(bean);
// Custom object value changes since we pass as the object reference but Map remains with actual value
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println("-------------------------");
// Testing Pass by value - CANT UNDERSTAND why it changed the object since it has to be pass-by-value and not by ref in this case ??
// Why setting to null not chainging the value but clear does ?
passby.changeObject2CLEAR(map);
System.out.println(map.toString());
}
}
Bạn đang chuyển * tham chiếu * theo giá trị. Rất nhiều về điều này trên Google. Câu hỏi hay. – Bathsheba
@Arun Tôi đã cập nhật câu trả lời của tôi để giải quyết các hình thức tinh tế của câu hỏi của bạn –
Trong ngắn 'changeObject2NULL (Bản đồ m)' chứa biến * cục bộ * riêng của nó 'm' cũng là tham số phương thức. Khi bạn sử dụng phương thức này như 'changeObject2NULL (map)' 'm' sao chép thông tin về đối tượng' map' giữ (địa chỉ này là * value * của biến 'map'). Vì vậy, khi bạn gọi 'm.clear()', nó gọi phương thức 'clear' trên cùng một đối tượng' map' giữ để bạn có thể thấy trạng thái mới của đối tượng đó thông qua 'map'.Khi bạn gọi 'm = null', bạn chỉ cần thay đổi đối tượng' m' nào thành 'null'; điều này không ảnh hưởng đến 'bản đồ' hoặc đối tượng mà nó đang đề cập đến. –
Pshemo