我不完全理解 Java 何时传递副本/值以及何时传递“引用”(指针)。
我正在尝试分配我拥有的静态对象的副本,但我不确定如何去做。
我有这个:
static ArrayList<MyObject> myObjects;
我想获取 myObjects 的副本,以便我可以在不影响原始值的情况下使用这些值。当我像这样使用 getter 时,它是否传递引用或副本/值:
public static ArrayList<MyObject> getMyObject()
{
return ThisClass.myObjects;
}
返回什么?如果是引用,我怎样才能得到一份副本?
我看过这些:
( How do I copy an object in Java? )
( Java: getter method vs. public instance variable: performance and memory )
( Is Java "pass-by-reference" or "pass-by-value"? )
( How can Java assignment be made to point to an object instead of making a copy? )
但我还是不太明白我会得到什么。
最佳答案
Java 将始终返回引用而不是副本,只要它不是原始类型(也称为 long
、int
、short
、等或原始包装器之一 Long
、Integer
、Short
。
要获得副本,您需要复制数据、使用复制构造函数或使用 clone
方法,这将创建一个具有适当值的新对象。
带有列表的复制构造函数的示例,默认情况下这是一个“浅复制”,意味着内部的对象是相同的。
List<MyObject> myNewCopiedList = new ArrayList<MyObject>(oldList);
对于“深层复制”,这意味着可以在不影响原始对象的情况下改变内部对象,您需要制作一个新列表,然后添加对象的副本/克隆并添加。
例如,假设 MyObject 有一个复制构造函数或一个 clone
方法。
List<MyObject> myNewCopiedList = new ArrayList<MyObject>();
for (MyObject myo : oldList){
myNewCopiedList.add(new MyObject(myo)); // if there is a copy constructor
myNewCopiedList.add(myo.clone()); // if there is clone method
}
关于java - 获取对象的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16922966/