获取对象的副本

Ril*_*eyE 2 java getter pointers reference

我不完全理解Java何时传递副本/值以及何时传递"引用"(指针).

我正在尝试分配我拥有的静态对象的副本,但我不确定如何去做.

我有这个:

static ArrayList<MyObject> myObjects;
Run Code Online (Sandbox Code Playgroud)

我想获得myObjects的副本,以便我可以在不影响原始值的情况下使用值.当我使用这样的getter时它是否传递引用或副本/值:

public static ArrayList<MyObject> getMyObject()
{
    return ThisClass.myObjects;
}
Run Code Online (Sandbox Code Playgroud)

那回报是什么?如果是参考,我怎样才能获得副本?

我见过这些:

(如何在Java中复制对象?)

(Java:getter方法与公共实例变量:性能和内存)

(Java是"通过引用传递"还是"按值传递"?)

(如何将Java赋值指向对象而不是复制?)

但我仍然不太明白我会得到什么.

gre*_*dha 5

Java将永远只要返回一个参考,而不是副本,因为它不是一个基本类型(又名long,int,short,等,或原始包装中的一个Long,Integer,Short.

要获取副本,您需要复制数据,使用复制构造函数,或使用clone将创建具有适当值的新对象的方法.

带有列表的复制构造函数的示例,默认情况下,这是一个"浅复制",意味着里面的对象是相同的.

List<MyObject> myNewCopiedList = new ArrayList<MyObject>(oldList);
Run Code Online (Sandbox Code Playgroud)

对于"深层复制",意味着内部对象可以在不影响原件的情况下进行变异,您需要创建一个新的List然后添加对象的副本/克隆并添加.

例如,假设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
}
Run Code Online (Sandbox Code Playgroud)