我想创建一个以方法形式存储某些事件的类。当其中一个被调用时,我想让它取一个对象并对其进行修改,但如果我没有错,那么该方法的参数只是真实对象的副本,所以它不会改变任何事情。 有办法吗?我希望我已经足够清楚......
答案 0 :(得分:0)
是的,你说JAVA是pass by value
是正确的,它会发送该对象的副本,但请记住,如果对象的副本将指向与原始对象相同的引用。
无论你在传递的对象中修改什么,都会反映在原始对象中。这是因为引用仍然相同。
例如,
public class Foo {
private int x;
/* Getter-Setter */
}
现在,请考虑以下两个对象:
Foo realObject = new Foo();
realObject.setX(1);
/* Call someMethod */
someMethod(Foo realObject);
/* someMethod Implementation */
public void someMethod(Foo copyObject) {
copyObject.setX(5);
}
现在,您在copyObject
中所做的更改将反映在realObject
中,因为它在内部引用了相同的位置。因此,x
中realObject
的值将从1
更改为5
。
实现您要做的事情的最佳方法是在POJO类中使用复制构造函数。
例如,
public class Foo {
private int x;
public Foo(Foo f) {
this.x = f.x;
}
}
现在,您可以按如下方式复制对象:
Foo realObject = new Foo();
realObject.setX(1);
/* Make Copy */
Foo copyObject = new Foo(realObject);
copyObject.setX(5);
此时更改为copyObject
不会影响realObject
。 x
中realObject
的值仍为1
。