Java深复制和浅复制

Java:
假设有如下文件House.java

public class House implements Cloneable,Comparable{
    private int id;
    private double area;
    private java.util.Date whenBuilt;
    
    public House(int id,double area){
        this.id=id;
        this.area=area;
        whenBuilt = new java.util.Date();
    }

    public int getId(){
        return id;
    }

    public double getArea(){
        return area;
    }

    public java.util.Date getWhenBuilt(){
        return whenBuilt;
    }

    @Override
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }

    public int compareTo(Object o){
        if(area>((House)o).area)
           return 1;
        else if(area<((House)o).area)
           return -1;
        else
           return 0;
    }
}

于是,我们可以这样操作:
House house1 = new House(1,1750.50);
House house2 = (House)house1.clone();
System.out.println(house1==house2) --- false //两个不同的对象
Syetem.out.println(house1.whenBuilt==house2.whenBuilt) --- true//引用复制

由此得出浅复制的结论:
如果一个数据域是基本类型,复制的就是它的值;如果一个数据域是对象,复制的就是该域的引用。

为了实现深复制,可进行如下操作:

@Override
public Object clone() throws CloneNotSupportedException{
      try{
            House house = (House)super.clone();
            house.whenBuilt = (java.util.Date)(whenBuilt.clone());
            return house;
      }catch(CloneNotSupportedException e){
            return null;
       }
}

于是进行相同操作后得:
Syetem.out.println(house1.whenBuilt==house2.whenBuilt) --- false //值复制

值得注意的是,如果House没有覆盖clone()方法,程序就会收到一个语法错误,因为在java.lang.Object中clone()是被保护的。其原型为protected native Object clone() throws CloneNotSupportedException。如果House不实现java.lang.Cloneable,调用House.java的super.clone()会导致一个CloneNotSupportedException异常。为了克隆一个对象,该对象的类必须覆盖clone()方法并实现Cloneable

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Object类位于java.lang包中,java.lang包有最基础的和核心的类,在编译时会自动导入; Obje...
    遇见你的故事阅读 668评论 0 0
  • 我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean...
    peteLee阅读 712评论 1 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 他关上一扇窗子 像拒绝了整个尘世 嘈杂的,色彩艳丽的 猫叫和小孩子的哭声 他把希望都写在纸上 像喋喋不休的智者 贫...
    一个海鱼阅读 118评论 0 7
  • 不得不说,迪丽热因为自己本身的新疆人的属性,在演艺圈内长相一定算是很多女演员中让你过目不忘的明星之一,专业院校出身...
    果果想读书阅读 1,005评论 4 2