Java深复制与浅复制&Clone

    浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。  

    深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍。  

    Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。必须要遵循下面三点  

    1.在派生类中覆盖基类的clone()方法,并声明为publicObject类中的clone()方法为protected的】。  

    2.在派生类的clone()方法中,调用super.clone()  

    3.在派生类中实现Cloneable接口。

    Object类里的clone方法是浅复制(浅克隆)

浅复制:

public class CloneTest {
	public static void main(String[] args) throws CloneNotSupportedException {
		Teacher teacher=new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher Zhang");
		
		Student student1=new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);
		
		Student student2=(Student)student1.clone();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());
		System.out.println(student2.getTeacher().getAge());
		System.out.println(student2.getTeacher().getName());
		
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
		
		student2.setAge(18);
		student2.getTeacher().setAge(50);//浅复制针对对象的引用没有重新开辟新的空间
		student2.getTeacher().setName("Teacher Li");	//改变值后相应的都改变
		
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getAge());
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}
class Teacher{
	private int age;
	private String name;
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
}
class Student implements Cloneable{
	private int age;
	private String name;
	private Teacher teacher;
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public Teacher getTeacher() {return teacher;}
	public void setTeacher(Teacher teacher) {this.teacher = teacher;}
	public Object clone()throws CloneNotSupportedException{
		return super.clone();
	}
}

 

深复制:

public class DeepCloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
		Teacher teacher = new Teacher();
		teacher.setAge(40);
		teacher.setName("Teacher Zhang");

		Student student1 = new Student();
		student1.setAge(20);
		student1.setName("zhangsan");
		student1.setTeacher(teacher);

		Student student2 = (Student) student1.clone();
		System.out.println(student2.getAge());
		System.out.println(student2.getName());
		System.out.println(student2.getTeacher().getAge());
		System.out.println(student2.getTeacher().getName());

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
		student2.setAge(18);
		student2.getTeacher().setAge(50); //浅复制针对对象的引用没有重新开辟新的空间
		student2.getTeacher().setName("Teacher Li"); // 改变值后相应的都改变

		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
		System.out.println(student1.getAge());
		System.out.println(student1.getTeacher().getAge());
		System.out.println(student1.getTeacher().getName());
	}
}
class Teacher implements Cloneable {
	private int age;
	private String name;

	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

class Student implements Cloneable {
	private int age;
	private String name;
	private Teacher teacher;
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public Teacher getTeacher() {return teacher;}
	public void setTeacher(Teacher teacher) {this.teacher = teacher;}
	public Object clone() throws CloneNotSupportedException {
		Student student = (Student) super.clone();
		student.setTeacher((Teacher) (student.getTeacher().clone()));
		return student;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值