JAVA 中浅拷贝与深拷贝有什么区别?

时间:2022-11-19 19:48:15
JAVA 中浅拷贝与深拷贝有什么区别?具体该怎么处理

11 个解决方案

#1


对类以及需要复制的成员对象实现Clonable接口,或者用序列化 可以深拷贝
否则只能浅拷贝了吧

#2


浅拷贝就是仅仅对成员的引用进行拷贝。深拷贝就是对成员再次进行浅拷贝

#3


能不能再具体点啊

#4


浅拷贝就是仅仅对成员的引用进行拷贝。深拷贝就是对成员再次进行浅拷贝
比如:
class A{
private String str1;

public getStr1{
    return str1;
}
...
}

class B{
    private String str2;
    private A a;

    public getStr1{
        return str1;
    }

    public getA{
        return a;
    }
    ...
}

B obj1 = new B();
obj1.setStr2 = "123";
obj1.getA.setStr1 = "456";

B obj2 = obj1.浅拷贝.
obj2.getA.setStr1 = "789";
此时obj1.getA.getstr1 = "789".//因为引用的是同一对象
如果是深拷贝
obj2.getA.setStr1 = "789";
此时obj1.getA.getstr1 = "456".//因为此时obj2中a为新对象.

#5


那我怎么来定义浅拷贝和深拷贝呢?

#6


浅拷贝只是增加一个引用对象,在内存中只是针对其地址进行引用。深拷贝是增加一个新的对象,该对象的值与原对象相等,但不是指向原地址,而是一个新的地址

#7


只要你调用super.clone()就能实现浅拷贝。
但如果你copy的对象中还包含其他的对象,这个时候浅拷贝就不行了。
只能重写clone()方法,自己写代码实行了

#8


老师给你们留了作业,你们班只有小A一个人会写,其他人都需要copy他的作业。

如果你们都是通过浅拷贝来完成作业,那么就相当与“在你需要的时候,小A会把作业借给你”。
例如,老师对小B说“去把你的作业拿来给我看看”,小B赶快找小A借作业给老师看。老师又要看小C的作业,小C也只能找小A借过来应付老师。总之老师如果一个一个的检查作业,你们都能应付,因为你们只有一本作业互相借着看一下就OK了。如果老师说“全班把作业一起交上来”,那你们就完蛋了。

深拷贝就是每个人都实实在在的抄了一份作业,每个人的作业都是自己抄来的,所以老师收全班的作业你们也不怕,要多少本就给他多少本,呵呵。

#9


唉,感觉浅拷贝深拷贝两词的提出就是在烦扰初学者。老师根本不应该提这些词,学到一定程度以后再看,一目了然,根本不需要解释。结果现在人家对象机制学得还不深刻就提出来,然后换着花样解释了好半天,越解释越糊涂。纯粹是找麻烦。

#10


andycpp(幻瞳) 的比喻非常好

#11


andycpp(幻瞳) 的比喻非常好
我也赞同!!!

#1


对类以及需要复制的成员对象实现Clonable接口,或者用序列化 可以深拷贝
否则只能浅拷贝了吧

#2


浅拷贝就是仅仅对成员的引用进行拷贝。深拷贝就是对成员再次进行浅拷贝

#3


能不能再具体点啊

#4


浅拷贝就是仅仅对成员的引用进行拷贝。深拷贝就是对成员再次进行浅拷贝
比如:
class A{
private String str1;

public getStr1{
    return str1;
}
...
}

class B{
    private String str2;
    private A a;

    public getStr1{
        return str1;
    }

    public getA{
        return a;
    }
    ...
}

B obj1 = new B();
obj1.setStr2 = "123";
obj1.getA.setStr1 = "456";

B obj2 = obj1.浅拷贝.
obj2.getA.setStr1 = "789";
此时obj1.getA.getstr1 = "789".//因为引用的是同一对象
如果是深拷贝
obj2.getA.setStr1 = "789";
此时obj1.getA.getstr1 = "456".//因为此时obj2中a为新对象.

#5


那我怎么来定义浅拷贝和深拷贝呢?

#6


浅拷贝只是增加一个引用对象,在内存中只是针对其地址进行引用。深拷贝是增加一个新的对象,该对象的值与原对象相等,但不是指向原地址,而是一个新的地址

#7


只要你调用super.clone()就能实现浅拷贝。
但如果你copy的对象中还包含其他的对象,这个时候浅拷贝就不行了。
只能重写clone()方法,自己写代码实行了

#8


老师给你们留了作业,你们班只有小A一个人会写,其他人都需要copy他的作业。

如果你们都是通过浅拷贝来完成作业,那么就相当与“在你需要的时候,小A会把作业借给你”。
例如,老师对小B说“去把你的作业拿来给我看看”,小B赶快找小A借作业给老师看。老师又要看小C的作业,小C也只能找小A借过来应付老师。总之老师如果一个一个的检查作业,你们都能应付,因为你们只有一本作业互相借着看一下就OK了。如果老师说“全班把作业一起交上来”,那你们就完蛋了。

深拷贝就是每个人都实实在在的抄了一份作业,每个人的作业都是自己抄来的,所以老师收全班的作业你们也不怕,要多少本就给他多少本,呵呵。

#9


唉,感觉浅拷贝深拷贝两词的提出就是在烦扰初学者。老师根本不应该提这些词,学到一定程度以后再看,一目了然,根本不需要解释。结果现在人家对象机制学得还不深刻就提出来,然后换着花样解释了好半天,越解释越糊涂。纯粹是找麻烦。

#10


andycpp(幻瞳) 的比喻非常好

#11


andycpp(幻瞳) 的比喻非常好
我也赞同!!!