Java深复制和浅复制

作者: Louis_陆 | 来源:发表于2016-04-13 11:28 被阅读373次

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

相关文章

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • Java复制

    概述 Java复制分为三类:直接赋值、浅拷贝和深拷贝。 Java复制是基于Object的clone()方法。 由此...

  • Java 浅拷贝和深拷贝 拷贝和复制

    Java 复制与拷贝 大纲 浅拷贝和深拷贝 浅拷贝就是复制对象的一个精确副本 ==对于基本数据类型就是复制值,对于...

  • Java深复制浅复制解析.md

    Java 克隆概念 Java克隆分为深克隆和浅克隆两种类型。 浅复制(浅克隆)被复制对象的所有变量都含有与原来的对...

  • JAVA 深拷贝 浅拷贝

    JAVA 深拷贝 浅拷贝 浅拷贝只是复制了引用, 这个引用还是指向原来的值 深拷贝那就是直接复制了整个Object...

  • 专题一:java复制

    java复制 将一个对象的引用复制给另外一个对象,一共有三种方式 ①直接复制 ②浅拷贝 ③深拷贝 一、直接复制 A...

  • Java的浅拷贝与深拷贝

    Java的浅拷贝与深拷贝 一、概念 浅拷贝浅拷贝仅仅复制所考虑的对象(包括对象中的基本变量),而不复制它所引用的对...

  • 深拷贝和浅拷贝(Shallow Copy and Deep Co

    概述 这里的拷贝是指在java中如何将对象复制一份。有深拷贝和浅拷贝之分。 浅拷贝是对象在复制时,基础数据类型进行...

  • 深拷贝与浅拷贝的理解及常用方法

    深拷贝和浅拷贝的区别 首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只...

  • Java深复制和浅复制

    Java:假设有如下文件House.java 于是,我们可以这样操作:House house1 = new Hou...

网友评论

  • 郑钦洪_:没答到题眼上 深复制和浅复制的最大差别 浅复制只是复制了指针指向的内容不变指针地址变了,深复制是开辟一个新的空间把原来指针的内容逐一复制一遍

本文标题:Java深复制和浅复制

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