浅克隆与深克隆的区别-java

来源:互联网 发布:cp1200写频软件下载 编辑:程序博客网 时间:2024/06/05 23:01

浅克隆:只能克隆对象本身,对于依附于对象的对象则不予克隆对象,只对其地址克隆
浅克隆需要注意的地方:
1:被克隆的对象需要实现Cloneable
2:Cloneable没有方法,是个标志性克隆
3:如果被克隆的对象维护着另一个,则只克隆了地址

下面给出一个例子:
一个person类里面维护着一个Address类,p2克隆p1的时候只对person进行克隆,对于依附于person类的Address类并没有克隆,只是复制其地址
下面的代码是person类和Address类

import java.io.Serializable;class Address implements Serializable{    String address;    public Address(String address){        this.address=address;    }}public class Person implements Cloneable,Serializable{    Address a;    String bianhao;    String name;    public Person(String bianhao,String name,Address a){        this.bianhao=bianhao;        this.name=name;        this.a=a;    }    @Override    public String toString() {        return "Person [a=" + a.address + ", bianhao=" + bianhao + ", name=" + name + "]";    }    @Override    public Object clone() throws CloneNotSupportedException {        // TODO Auto-generated method stub        return super.clone();    }}

下面的代码是用浅克隆的测试

public class Demo1 {    public static void main(String[] args) throws Throwable {        Address a=new Address("河南");        Person p1=new Person("123", "张三", a);        Person p2=(Person) p1.clone();        p2.name="李四";        p2.a.address="北京";        System.out.println("p1:"+p1);        System.out.println("p2:"+p2);    }}

下面是运行上面代码所产生的结果:
这里写图片描述

深克隆:深克隆是对其依附的对象也进行克隆
深克隆需要注意的地方:
1:利用IO流进行存储,然后进行读取
2:需要实现可序列化接口(java.io.Serializable)
下面是用深克隆进行克隆的例子:
person和Address跟上面的一样
下面是测试类代码:

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class Demo2 {    public static void main(String[] args) throws Throwable {           Address a=new Address("河南");        Person p1=new Person("110", "张三", a);        writObject(p1);        Person p2=readObject();        p2.a.address="北京";        p2.name="李四";        System.out.println("p1:"+p1);        System.out.println("p2:"+p2);    }    /*     * 从文件中读取这个对象     */    public static Person readObject() throws Exception{            File f=new File("person.txt");            ObjectInputStream in=new ObjectInputStream(new FileInputStream(f));            Person pp=(Person)in.readObject();            in.close();            return pp;    }    /*     * 将对象写入磁盘     */    public static void writObject(Person p) throws Exception{        File f=new File("./person.txt");        ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(f));        out.writeObject(p);        out.close();        }}

运行结果为:
这里写图片描述

注意!!!!
利用下面的代码不叫克隆,这个只是对象的引用

Person p1=new Person("110", "张三", a);Person p2=p1;

分享完毕!!!!

0 0
原创粉丝点击