`

Java深复制与浅复制&Clone

    博客分类:
  • java
 
阅读更多

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

 

 

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

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

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

     1. 在派生类中覆盖基类的 clone() 方法,并声明为 public Object 类中的 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;
	}
}

 

分享到:
评论

相关推荐

    Java Clone深拷贝与浅拷贝的两种实现方法

    今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Java Clone(类的复制)实例代码

    Java Clone(类的复制)实例代码 Java Clone(类的复制)实例代码

    浅析Java中clone()方法浅克隆与深度克隆

    Java克隆(Clone)是Java语言的特性之一,本篇文章主要介绍了Java中的Clone机制是如何工作的,需要的朋友可以参考下

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建

    Java中的数组复制(clone与arraycopy)代码详解

    主要介绍了Java中的数组复制(clone与arraycopy)代码详解,本文并未全部介绍数组复制的几种方式,仅对clone和copy的相关内容进行了解析,具有一定参考价值,需要的朋友可以了解下。

    Java 数组复制clone方法实现详解

    主要介绍了Java 数组复制clone方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java中的clone方法详解_动力节点Java学院整理

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。下面通过本文给大家介绍java中的clone方法,感兴趣的朋友一起看看吧

    详解Java中的clone方法?原型模式

     clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...

    如何通过JVM角度谈谈Java的clone操作

    java中仅有的创建对象的两种方式:①.使用new操作符创建对象...使用clone方法复制对象。下面这篇文章主要通过JVM角度给大家详细谈谈Java的clone操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    实现数组复制常用的5种方式及组合类的深复制(深拷贝)

    在Java语言中,一般会采用下面的几种方法进行数组的复制。 a) for循环逐一复制; b) System.arraycopy()方法 c) Arrays.copyOf()方法 d) 使用clone()方法 e) Arrays.copyOfRange()方法 接下来,我们看下这几种方法...

    c python java 复制数组 深浅拷贝

    直接使用 “=” 复制,浅拷贝,两个数组地址一样,改变其中一个,另一个也变化 int[] a1 = {1, 2,3}; int[] a2 = a1; a1[0] = 0; System.out.println(Arrays.toString(a1)); //[0,2,3] System.out.println(Arrays....

    Java clone()方法来由及用法

    并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子: ...

    J2SE笔记讲解个人修订(1.1).docx

    1 JAVA认识 2 JAVA数据类型 3 面向对象程序设计 4 JAVA集合 5 JAVA反射机制 6 JAVA注解(ANNOTATION) 7 JAVA中的异常类 ...20 JAVA克隆CLONE(复制) 21 JAVA 网络编程 22 JAVA 其他未归类 23 JNI概述

    java 编程入门思考

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Java初学者入门教学

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

Global site tag (gtag.js) - Google Analytics