首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浅拷贝-新实例或赋值

浅拷贝-新实例或赋值
EN

Stack Overflow用户
提问于 2012-12-02 08:11:11
回答 4查看 2.3K关注 0票数 4

浅拷贝是指具有相同属性值的对象的“复制”,无论是原始值还是引用值。

在执行浅层复制时,是否需要“创建一个新实例”?作为:

代码语言:javascript
复制
public class A {
    int aValue;
    B bObj;

    ...

    public A createShallow(A a1Obj) {
        A aObj = new A();
        aObj.aValue = a1Obj.aValue;
        aObj.bObj = a1Obj.bObj;

        return aObj;
    }
}

或者按任务复制也被认为是浅拷贝:

代码语言:javascript
复制
B b = new B(10);
A a = new A(1, b);

A a1 = a;

维基百科的文章将浅拷贝定义为共享相同内存块的引用变量。因此,根据这个副本的分配,也将是一个浅的副本。

但是,它不是指向同一个对象的变量,而不是对象的“复制”吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-02 08:17:40

在执行浅层复制时,是否需要“创建一个新实例”?

是的,您必须创建一个实例来创建对象的副本( shallowdeep)。只需执行引用的赋值,就会创建指向同一个实例的copy of reference

您已经使用了一个正在创建non-static methodcopy。但总的来说,我更喜欢两种方式:-

要么使用copy-constructor:-

代码语言:javascript
复制
public A(A obj) {
    copy.aValue = obj.aValue;
}

然后用它像:-

代码语言:javascript
复制
A first = new A();
A copy = new A(first);

或者,使用一个public static method,它接受一个实例并返回该实例的副本。

代码语言:javascript
复制
public static A createCopy(A obj) {
    A copy = new A();
    copy.aValue = obj.aValue;
    return copy;
}
票数 4
EN

Stack Overflow用户

发布于 2012-12-02 08:12:11

赋值不是副本--它只是对同一个实例的第二个引用。

一个副本必须是一个新实例,否则它不是一个副本;它只是另一个引用。

票数 3
EN

Stack Overflow用户

发布于 2012-12-02 08:15:20

在执行浅层复制时,是否需要“创建一个新实例”?作为:

是的,这是必要的。

或者按任务复制也被认为是浅拷贝:

不,这是一个完全不同的行动。没有副本;这只是创建了对现有对象的新引用。如果通过此新引用修改对象,则仍在修改原始对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13667556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档