美文网首页
2021-03-28_Java中的对象复制

2021-03-28_Java中的对象复制

作者: 微笑碧落 | 来源:发表于2021-06-13 09:31 被阅读0次

1.传值和传址的区别

  • java中基本数据类型(int等)的复制是传值复制。
  • 对于对象而已,却是复制对象引用。所以简单的赋值操作符obj1 = obj2是不起作用的.obj1和obj2都指向同一个内存对象。
  • 函数式编程,第三公民的不同(后面补)

2.对象克隆

万对象之源:Object对象有个clone()方法,实现了对象中各个属性的复制。实体类实现克隆的方法:

  • 实现Cloneable接口,否则会抛出无法克隆异常(CloneNotSupportedException )。
  • 覆盖clone()方法,可见性提升为public。
public class Obj1 implements Cloneable{
    @Override
   public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

3.使用

Obj obj1 = new Obj();
Obj obj2 = (Obj) obj1.clone;

4.浅克隆和深克隆的区别

  • 浅克隆:被复制对象的所有值属性都含有与原来对象的相同,而所有的对象引用属性仍然指向原来的对象。
  • 深克隆:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象。
  • 简单来说就是Object对象提供的clone方法,仅仅克隆本源对象的基本属性,本源对象如果包含有对象,则这些对象一样是传址复制,不会产生一个新对象。
  • 所以想要实现深克隆,该对象的所有引用对象都需要实现cloneable接口并覆盖clone()方法。
  • 同时必须在该对象的clone()方法中clone其他对象。如果这个对象包含的饮用对象也包含其他对象。。。。只能一路修改相应的clone()方法。
@Override
public Object clone() throws CloneNotSupportedException {
        Object obj=super.clone();
        Address a=((Person)obj).getAddress();
        ((Person)obj).setAddress((Address) a.clone());
        return obj;
}    

5.第三方克隆库

  • java如此对clone进行限制,可见,不到万不得已还是不要使用克隆。使用前建议想想,是不是程序设计模式有问题,导致一定需要clone
  • 如下是在第三方克隆库下作者的建议:deep cloning of Java classes might mean thousands of objects are cloned! Also cloning of files and streams might make the JVM crash。
  • 如果非要克隆对象,建议使用如下第三方库。不用大费周章的覆盖clone方法,实现cloneable接口。

相关文章

  • js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)

    在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制,今天鹏哥就带来js中的复制方法。 JS中对象...

  • 深复制与浅复制

    浅复制 浅复制就是,直接把一个对象(源对象)的属性复制到另一个对象(目标对象)中,当然,如果当属性中包含引用类型的...

  • Java对象复制之Cglib和mapstruct讲解

    1 Java对象复制 1.1 Cglib复制 BeanCopier是Cglib包中的一个类,用于对象的复制。注意:...

  • 剖析【OC】中深复制与浅复制

    在OC编程中,常常会用到对对象的复制,然后操作副本对象。然而对与应该选择何种对象复制的方式,复制后副本对象操作会不...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • PHP中对象的复制

    潜克隆(浅拷贝) 只能克隆对象的"非对象非资源"数据。但如果对象中属性存储的是对象类型,就可以看到克隆没有克隆对象...

  • PHP中的对象复制

    PHP中,=的作用都是将一个值复制给另一个(大多数编程语言都是一样),将=作用在基本数据类型上时,就直接进行了赋值...

  • Copy

    copy 复制 浅复制:指针的复制(地址的复制) 深复制:对象内容的复制 Foundion的基本对象复制 基本对象...

  • iOS面试题:浅复制和深复制的区别?

    浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个 A 对象,复制...

  • Python 浅复制与深复制

    《流畅的 Python》8.3 默认做浅复制 读书笔记 复制列表对象时,如果列表对象中包含其他列表对象,那么应该复...

网友评论

      本文标题:2021-03-28_Java中的对象复制

      本文链接:https://www.haomeiwen.com/subject/hscphltx.html