【发布时间】:2015-12-08 02:47:36
【问题描述】:
Java 支持按值传递(始终适用于副本),但是当您传递用户定义的对象时,它会更改实际对象(通过引用传递但没有指针更改),我理解这是为什么下面的 changeObject2CLEAR 方法实际上是在改变对象的值吗?相反,它必须在副本上工作?
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());
}
}
【问题讨论】:
-
您正在按值传递 reference。谷歌上有很多关于这个的。好问题。
-
@Arun 我已经更新了我的答案,以解决您问题的精炼形式
-
简而言之,
changeObject2NULL(Map<Integer, String> m)包含自己的 local 变量m,它恰好也是方法参数。当您使用此方法时,如changeObject2NULL(map)m会复制有关map持有哪个对象的信息(此地址是map变量的值)。因此,当您调用m.clear()时,它会在map持有的同一对象上调用clear方法,因此您可以通过map查看该对象的新状态。当您调用m = null时,您只需将m持有的对象更改为null;这不会影响map也不会影响它所指的对象。
标签: java pass-by-value