java中的深度拷贝

 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制

 深拷贝:对象,对象内部的引用均复制

 为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2

java中的深度拷贝 - 水到绝境是飞瀑 - 潜水的小企鹅
 
java中的深度拷贝 - 水到绝境是飞瀑 - 潜水的小企鹅
继承自java.lang.Object类的clone()方法是浅复制
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。Java的clone()方法
⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。


//实现克隆
//继承自java.lang.Object类的clone()方法是浅复制
package java课程;

//import java.io.Serializable;

class Point
{
   public int x;//方便下面使用
   public int y;
   public Point(int i,int j)
   {
       this.x = i;
       this.y = j;
   }
}

class Parent implements Cloneable//,Serializable
{
     public Point point;
     public int[] array;
     public String str;
    public Parent()
     {
         
     }
    public Parent(Point p,int [] array,String s)
    {
        this.point = p;
        this.array = array;
        this.str = s;
    }
    public Object Clone() throws CloneNotSupportedException 
    {
        Object object = null;
        object = (Parent)super.clone();
        return object;
    }
}

public class clone {
    public static void main(String [] args) throws                        CloneNotSupportedException
    {
        Point px = new Point(1,2);
        int [] array = new int[]{3,4,5};
        String ss = "Xiao_lu";
        Parent p1 = new Parent(px,array,ss);
        
        Parent p2 = (Parent)p1.Clone(); 
        p2.point = new Point(10,20);
        p2.array = new int[]{30,40,50};
        p2.str = "Lu_xiao";
        System.out.println("p1的属性:");
        System.out.println(p1.point.x);
        System.out.println(p1.point.y);
        for(int i = 0;i<p1.array.length;i++)
        {
             System.out.println(p1.array[i]);
        }
        System.out.println(p1.str);
        
       
        System.out.println("p2的属性:");
        System.out.println(p2.point.x);
        System.out.println(p2.point.y);
        for(int i = 0;i<p2.array.length;i++)
        {
             System.out.println(p2.array[i]);
        }
        System.out.println(p2.str);
    }
    
}

推荐阅读:
http://java.chinaitlab.com/oop/784559.html
http://coolmist.iteye.com/blog/127455







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值