zoukankan      html  css  js  c++  java
  • java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变。

    EX:java中:

     //holidayConfig.getEnd_time()会随着sTime的改变而改变

    sTime = holidayConfig.getEnd_time();

    sTime.setDate(sTime.getDate() + 1); 

    原因:他们是浅复制的关系,只是引用同一块内存地址

    解决方式:

    //使用Object的clone方法
    sTime = (Timestamp) holidayConfig.getEnd_time().clone();
    sTime.setDate(sTime.getDate() + 1);

    Java的clone()方法

    ⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
    ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
    ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
    ③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

    ⑵Java中对象的克隆
    ①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
    ②在派生类中覆盖基类的clone()方法,并声明为public。
    ③在派生类的clone()方法中,调用super.clone()。
    ④在派生类中实现Cloneable接口。

    //类中包含其他类的情况,clone()没有深度遍历
    class
    Professor { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } } public class Student implements Cloneable { String name;// 常量对象。 int age; Professor p;// 学生1和学生2的引用值都是一样的。 Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } o.p=(Professor)p.clone(); return o; } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); //这里的clone并没有克隆教授类 s2.p.name="lisi"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age); System.out.println("name="+s2.p.name+","+"age="+s2.p.age); //输出结果学生1和2的教授成为lisi,age为30。 } }
    //类中包含其他类的情况,clone()进行深度遍历
    class
    Professor implements Cloneable { String name; int age; Professor(String name,int age) { this.name=name; this.age=age; } public Object clone() { Object o=null; try { o=super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } } public class Student implements Cloneable { String name; int age; Professor p; Student(String name,int age,Professor p) { this.name=name; this.age=age; this.p=p; } public Object clone() { Student o=null; try { o=(Student)super.clone(); } catch(CloneNotSupportedException e) { System.out.println(e.toString()); } //对引用的对象也进行复制 o.p=(Professor)p.clone(); return o; } public static void main(String[] args) { Professor p=new Professor("wangwu",50); Student s1=new Student("zhangsan",18,p); Student s2=(Student)s1.clone(); s2.p.name="lisi"; s2.p.age=30; //学生1的教授不改变。 System.out.println("name="+s1.p.name+","+"age="+s1.p.age); System.out.println("name="+s2.p.name+","+"age="+s2.p.age); } }

    利用串行化来做深复制

    public Object deepClone() 
    { 
     //将对象写到流里 
     ByteArrayOutoutStream bo=new ByteArrayOutputStream(); 
     ObjectOutputStream oo=new ObjectOutputStream(bo); 
     oo.writeObject(this); 
     //从流里读出来 
     ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); 
     ObjectInputStream oi=new ObjectInputStream(bi); 
     return(oi.readObject()); 
    } 

    Jquery中的浅复制 深复制

     // Shallow copy

    var newObject = jQuery.extend({}, oldObject);

    // Deep copy {}可以换成数据类型

    var newObject = jQuery.extend(true, {}, oldObject); 

    可是在进行js中的Date()类型复制时发现setDate()方法以及一些其他方法并没有完全复制,

    最后直接用 new对象实现了复制,var sTime = new Date(config.startTime);

  • 相关阅读:
    lnmp配置https,配置pathinfo---------记录学习
    微信公众号第三方授权登录->自带源码-->自己记录学习
    二维数组排序
    php 图片,文件下载
    PHP最彻底的退出登录,清除session、cookie的代码
    php 安装redis扩展
    2020系统综合实践(七)第15组
    2020系统综合实践(六)第15组
    2020系统综合实践(五)
    2020系统综合实践(四)
  • 原文地址:https://www.cnblogs.com/linvan/p/6306605.html
Copyright © 2011-2022 走看看