java浅克隆和深克隆(串行化)

小栗子实现浅克隆(对象中的都是基本类型变量才可以)

实现Cloneable接口,重写clone()方法,通过super.clone()来实现克隆

public class Student implements Cloneable {
  
	private String name;
	private int age;
	
	public Student(String name,int age) {
		this.name=name;
		this.age=age;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Student student=null;
		// Object中的clone()识别出你要复制的是哪一个对象。
		student=(Student) super.clone(); 
		return student;
	}
	public static void main(String[] args) throws CloneNotSupportedException {
		 Student stu1=new Student("张三",18);
		 Student stu2=(Student) stu1.clone();
		 stu2.name="李四";
		 stu2.age=17;
		 //stu2的值修改后不影响stu1的
		 System.out.println("stu1 name:"+stu1.name+"age:"+stu1.age);
		 System.out.println("stu2  name:"+stu2.name+"age:"+stu2.age);
	}
}


深克隆

普通深克隆:被克隆对象实现Cloneable接口,对象的引用对象也要实现Cloneable接口,同时clone()方法中,对象通过super.clone(),对象的引用变量对象也要 .clone()进行克隆

public class Teacher implements Serializable{
 
	String name;
	int age;
	public Teacher(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}
public class DeepStudent implements Cloneable{
	 public  String name;
	  public int age;
	  public  Teacher teacher;
	
	  public DeepStudent(String name, int age, Teacher teacher) {
		super();
		this.name = name;
		this.age = age;
		this.teacher = teacher;
	}
	  
	  @Override
	  public Object clone() throws CloneNotSupportedException {
		  DeepStudent stu1=null;
		  stu1=(DeepStudent) super.clone();
		  stu1.teacher=(Teacher) teacher.clone();
		  return stu1;
	}
	  public static void main(String[] args) throws CloneNotSupportedException {
		Teacher teacher=new Teacher("王老师", 30);
		DeepStudent stu1=new DeepStudent("张三", 15, teacher);
		DeepStudent stu2=(DeepStudent) stu1.clone();
		stu2.teacher.name="赵老师";
		stu2.teacher.age=50;
   System.out.println("stu1的老师name="+stu1.teacher.name+"age="+stu1.teacher.age);				
   System.out.println("stu2的老师name="+stu2.teacher.name+"age="+stu2.teacher.age);				
		
	}
}

串行化实现深克隆

被克隆对象实现Serializable 接口,自定义一个用于串行化的方法,方法内通过ByteArrayOutputStream和ObjectOutputStream ,ByteArrayInputStream来对对象进行串行化(序列化)最后调用该方法即可实现克隆

public class Teacher implements Serializable{
	String name;
	int age;
	public Teacher(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}
public class DeepStudent2 implements Serializable{
    String name;
    int age;
    Teacher teacher;
	public DeepStudent2(String name, int age, Teacher teacher) {
		super();
		this.name = name;
		this.age = age;
		this.teacher = teacher;
	}
    
      public  Object deepClone1() throws IOException, ClassNotFoundException {
    	  ByteArrayOutputStream  bo=new ByteArrayOutputStream();
    	  ObjectOutputStream oo=new ObjectOutputStream(bo);
    	  oo.writeObject(this);
    	  ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
    	  ObjectInputStream oi=new ObjectInputStream(bi);
		return (oi.readObject());
	}
	
	public static void main(String[] args) throws ClassNotFoundException, IOException {
		Teacher teacher=new Teacher("赵老师",30);
		DeepStudent2 stu1=new DeepStudent2("张三", 18, teacher);
		DeepStudent2 stu2=(DeepStudent2) stu1.deepClone1();
		stu2.teacher.name="李老师";
		stu2.teacher.age=50;
		System.out.println("stu1 "+stu1.teacher.name+",age="+stu1.teacher.age);
		System.out.println("stu2 "+stu2.teacher.name+",age="+stu2.teacher.age);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值