Java深复制与浅复制&Clone

http://zzqrj.iteye.com/blog/572562

 

 

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

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

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

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

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

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

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

浅复制:

Java代码   收藏代码
  1. public   class  CloneTest {  
  2.     public   static   void  main(String[] args)  throws  CloneNotSupportedException {  
  3.         Teacher teacher=new  Teacher();  
  4.         teacher.setAge(40 );  
  5.         teacher.setName("Teacher Zhang" );  
  6.           
  7.         Student student1=new  Student();  
  8.         student1.setAge(20 );  
  9.         student1.setName("zhangsan" );  
  10.         student1.setTeacher(teacher);  
  11.           
  12.         Student student2=(Student)student1.clone();  
  13.         System.out.println(student2.getAge());  
  14.         System.out.println(student2.getName());  
  15.         System.out.println(student2.getTeacher().getAge());  
  16.         System.out.println(student2.getTeacher().getName());  
  17.           
  18.         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~" );  
  19.         System.out.println(student1.getTeacher().getAge());  
  20.         System.out.println(student1.getTeacher().getName());  
  21.           
  22.         student2.setAge(18 );  
  23.         student2.getTeacher().setAge(50 ); //浅复制针对对象的引用没有重新开辟新的空间   
  24.         student2.getTeacher().setName("Teacher Li" );     //改变值后相应的都改变   
  25.           
  26.         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~" );  
  27.         System.out.println(student1.getAge());  
  28.         System.out.println(student1.getTeacher().getAge());  
  29.         System.out.println(student1.getTeacher().getName());  
  30.     }  
  31. }  
  32. class  Teacher{  
  33.     private   int  age;  
  34.     private  String name;  
  35.     public   int  getAge() { return  age;}  
  36.     public   void  setAge( int  age) { this .age = age;}  
  37.     public  String getName() { return  name;}  
  38.     public   void  setName(String name) { this .name = name;}  
  39. }  
  40. class  Student  implements  Cloneable{  
  41.     private   int  age;  
  42.     private  String name;  
  43.     private  Teacher teacher;  
  44.     public   int  getAge() { return  age;}  
  45.     public   void  setAge( int  age) { this .age = age;}  
  46.     public  String getName() { return  name;}  
  47.     public   void  setName(String name) { this .name = name;}  
  48.     public  Teacher getTeacher() { return  teacher;}  
  49.     public   void  setTeacher(Teacher teacher) { this .teacher = teacher;}  
  50.     public  Object clone() throws  CloneNotSupportedException{  
  51.         return   super .clone();  
  52.     }  
  53. }  
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();
	}
}

 

深复制:

Java代码   收藏代码
  1. public   class  DeepCloneTest {  
  2. public   static   void  main(String[] args)  throws  CloneNotSupportedException {  
  3.         Teacher teacher = new  Teacher();  
  4.         teacher.setAge(40 );  
  5.         teacher.setName("Teacher Zhang" );  
  6.   
  7.         Student student1 = new  Student();  
  8.         student1.setAge(20 );  
  9.         student1.setName("zhangsan" );  
  10.         student1.setTeacher(teacher);  
  11.   
  12.         Student student2 = (Student) student1.clone();  
  13.         System.out.println(student2.getAge());  
  14.         System.out.println(student2.getName());  
  15.         System.out.println(student2.getTeacher().getAge());  
  16.         System.out.println(student2.getTeacher().getName());  
  17.   
  18.         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~" );  
  19.         System.out.println(student1.getTeacher().getAge());  
  20.         System.out.println(student1.getTeacher().getName());  
  21.         student2.setAge(18 );  
  22.         student2.getTeacher().setAge(50 );  //浅复制针对对象的引用没有重新开辟新的空间   
  23.         student2.getTeacher().setName("Teacher Li" );  // 改变值后相应的都改变   
  24.   
  25.         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~" );  
  26.         System.out.println(student1.getAge());  
  27.         System.out.println(student1.getTeacher().getAge());  
  28.         System.out.println(student1.getTeacher().getName());  
  29.     }  
  30. }  
  31. class  Teacher  implements  Cloneable {  
  32.     private   int  age;  
  33.     private  String name;  
  34.   
  35.     public   int  getAge() { return  age;}  
  36.     public   void  setAge( int  age) { this .age = age;}  
  37.     public  String getName() { return  name;}  
  38.     public   void  setName(String name) { this .name = name;}  
  39.     public  Object clone()  throws  CloneNotSupportedException {  
  40.         return   super .clone();  
  41.     }  
  42. }  
  43.   
  44. class  Student  implements  Cloneable {  
  45.     private   int  age;  
  46.     private  String name;  
  47.     private  Teacher teacher;  
  48.     public   int  getAge() { return  age;}  
  49.     public   void  setAge( int  age) { this .age = age;}  
  50.     public  String getName() { return  name;}  
  51.     public   void  setName(String name) { this .name = name;}  
  52.     public  Teacher getTeacher() { return  teacher;}  
  53.     public   void  setTeacher(Teacher teacher) { this .teacher = teacher;}  
  54.     public  Object clone()  throws  CloneNotSupportedException {  
  55.         Student student = (Student) super .clone();  
  56.         student.setTeacher((Teacher) (student.getTeacher().clone()));  
  57.         return  student;  
  58.     }  
  59. }  
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、付费专栏及课程。

余额充值