java - 获取对象的副本

标签 java pointers reference getter

我不完全理解 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 将始终返回引用而不是副本,只要它不是原始类型(也称为 longintshort、等或原始包装器之一 LongIntegerShort

要获得副本,您需要复制数据、使用复制构造函数或使用 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/

相关文章:

java - 从 Java 在 MySQL 中创建临时表

Java并发,什么情况下CompletableFuture.supplyAsync()会返回null

c - 如何创建可变大小的数组,将可变二维数组传递给函数并返回另一个二维数组?

c - 将指针值数组传递给c中的文件

java - twitter4j twitterobjectfactory.createstatus 将 retweetedStatus 返回为 null

c++ - 如何通过迭代器通过指针调用函数?

c++ - 数组访问的返回类型

excel - VBA 求解器编译错误 : Sub or Function not defined

C#:非静态字段、方法或属性需要对象引用

java - 方法 getText() 对于 EditText 类型是未定义的——怎么办?