java克隆

java的克隆主要分为浅克隆和深克隆两种,接下来分别介绍一下这两种克隆

浅克隆

接下来克隆一个person对象

需要注意,在Person类里有一个Brain类,将Person类克隆一份



public class Person implements Cloneable{
	Brain b;

	public Person(Brain b) {
		super();
		this.b = b;
	}
	public static void main(String[] args) throws CloneNotSupportedException {
		/**
		 * 浅克隆:浅克隆利用的为Object里的colon方法完成的克隆
		 */
		Brain b=new Brain();
		Person p=new Person(b);
		Person p2 = (Person) p.clone();
		//比较两个对象的地址和脑子这个对象的地址
		System.out.println(p==p2);
		System.out.println(p.b==p2.b);
		结果:false浅克隆
			true
			通过结果可以发现克隆出来的p2是不同的,但是P2里的Brain对象没有被克隆过来
	}
	
}

重点
1:浅克隆需要去实现cloneable类,这个类没有任何东西,是个标记性类
2:浅克隆是通过object类里自带的方法进行克隆的
3:克隆出来的对象,对象时克隆过来的,但对象里面的对象没有被克隆过来

深克隆

深克隆没有使用object里的方法,而是使用的流的方式,将对象写进一个文件里,然后在文件中写出来,完成克隆
主要用到ObjectInputStream\ObjectOutputStream两个类,并且需要实现serializable接口

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 浅克隆需要实现cloneable接口,这是个标记性接口
 * @author lenovo
 *
 */
public class Person implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Brain b;

	public Person(Brain b) {
		super();
		this.b = b;
	}
	
	public static void main(String[] args) throws Exception {
	Brain b=new Brain();
	Person p=new Person(b);
	
	//将文件写入对象中
	ObjectOutputStream oop=new ObjectOutputStream(new FileOutputStream(new File("person.abc")));
	oop.writeObject(p);
	
	//将文件里的对象读出来(克隆一份)
	ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("person.abc")));
	Person p2 = (Person) ois.readObject();
	
	
	System.out.println(p==p2);
	
	System.out.println(p.b==p2.b);
	}
	
}
结果:false
	 false

可以看出来,不仅Person对象克隆了,Person里的Brain对象也克隆了一份

重点:
1:深克隆需要实现Serializable接口
2:深克隆使用的流的方式,将文件写进文件,当克隆的时候写出来
3:实现Serializable需要添加一个序列化序号,只有当序列化一致,才可以克隆
4:克隆出来的对象,对象时克隆过来的,对象里面的对象也被克隆过来

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值