`

clone java的深克隆和浅克隆

 
阅读更多

浅复制(浅克隆):将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制(深克隆):将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完

如有以下两个类

import java.io.Serializable;

public class Teacher implements Cloneable,Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
	private Integer age;
	private String sex;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Student implements Cloneable,Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	private String sex;
	private Teacher teacher;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	// clone
	public Student clone(){
		Student student = null;
		try {
			student = (Student) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return student;
	}
	
	//deepClone();
	public Student deepClone() throws Exception{
		//将对象写入流
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this);
		
		//将对象从流中读出
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		Student student = (Student) ois.readObject();
		ois.close();
		bais.close();
		oos.close();
		baos.close();
		return  student;
		
	}
	
}

  

 

新建测试类

public class TestCloneApp {
	public static void main(String[] args) throws Exception {
		
		Teacher teacher = new Teacher();
		teacher.setName("张老师");
		teacher.setAge(53);
		teacher.setSex("男");
		
		
		Student student = new Student();
		student.setAge(5);
		student.setName("张三");
		student.setSex("女");
		student.setTeacher(teacher);
		
		//clone
		Student cloneStudent = student.clone();
		
		cloneStudent.setName("李四");
		cloneStudent.setSex("男");
		cloneStudent.getTeacher().setName("李老师");;
		//deepClone
		
		Student deepClone = student.deepClone();
		deepClone.setName("aaa");
		deepClone.setSex("bbb");
		deepClone.getTeacher().setName("cccc");
		System.out.println("person"+"------->"+"name: "+student.getName()+",age: "+student.getAge()+",sex: "+student.getSex()+",teacher: "+student.getTeacher().getName());
		System.out.println("clonePerson"+"------->"+"name: "+cloneStudent.getName()+",age: "+cloneStudent.getAge()+",sex: "+cloneStudent.getSex()+",teacher: "+cloneStudent.getTeacher().getName());
		System.out.println("deepClone"+"  ------->"+"name: "+deepClone.getName()+",age: "+deepClone.getAge()+",sex: "+deepClone.getSex()+",teacher: "+deepClone.getTeacher().getName());
		
	}
}

 

输出结果如下

student------->name: 张三,age: 5,sex: 女,teacher: 李老师

cloneStudent------->name: 李四,age: 5,sex: 男,teacher: 李老师

deepClone  ------->name: aaa,age: 5,sex: bbb,teacher: cccc

 

总结: 

浅克隆会复制一个对象,对象属性是基本类型的会重现创建,相当于复制。而是引用类型的则是指向原对象的引用地址。所以当 cloneStudent 对象改变teacher姓名时,student对象的teacher姓名也改变。

 

深克隆也会复制一个对象,但是不管对象的属性是基本类型还是引用类型,都会重新辅助一份。所以当deepClone 改变任意属性时,原对象(student)的属性都不会受到影响。

 

 

分享到:
评论

相关推荐

    java 深克隆与浅克隆

    Java 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的...Java 中的克隆机制可以方便地制造出对象的副本,但是需要注意浅克隆和深克隆的区别,并且需要正确地使用 Clone 方法,以避免不利的结果。

    java 深克隆 浅克隆

    在Java编程语言中,克隆是...理解深克隆和浅克隆的概念对于编写复杂的、性能敏感的Java程序至关重要,尤其是在处理大量对象或需要保持数据独立性时。根据具体需求选择合适的克隆策略,可以提高代码的灵活性和可维护性。

    java 深克隆浅克隆

    Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,这个方法是Object类提供的。当一个对象被浅克隆时,新创建的对象将拥有原始对象的...

    JAVA浅克隆与深克隆

    测试类`Test.java`可以用来验证浅克隆和深克隆的效果,比如改变克隆对象的属性并检查原始对象是否受影响。 总结来说,Java中的克隆机制对于复制对象和维护对象状态的独立性至关重要。浅克隆适用于不涉及复杂引用...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    Java提供了两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。下面我们将深入探讨这两种克隆方法。 ### 浅克隆 浅克隆是指创建一个新的对象,其成员变量的值与原对象相同,但引用类型成员变量...

    Java中的克隆(Clone)机制

    总结来说,Java中的克隆机制提供了一种创建对象副本的方式,分为浅克隆和深克隆两种形式,适用于不同的对象结构需求。正确理解和使用克隆机制,可以帮助开发者更有效地管理和复制复杂的数据结构,避免因共享数据导致...

    Java深浅clone

    在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让我们理解`Cloneable`接口。在Java中,如果一个类想要支持`clone()`方法,它必须实现`...

    实例分析java对象中浅克隆和深克隆

    浅克隆和深克隆在Java对象中的应用 在Java编程语言中,克隆(Clone)是一种常见的对象复制机制。克隆可以分为浅克隆(Shallow Clone)和深克隆(Deep Clone)两种。浅克隆仅复制对象的引用,而深克隆则完全复制对象...

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

    在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep Clone)。 1. 浅克隆(Shallow Clone) 浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double...

    java的深度克隆的例子

    首先,Java提供了两种基本的克隆方式:浅克隆(shallow clone)和深克隆。浅克隆仅仅复制对象本身,而不复制对象所引用的对象。而深克隆则会递归地复制对象及所有引用的对象,确保新创建的对象和原始对象及其引用的...

    java 对象的克隆(浅克隆和深克隆)

    总结起来,Java对象的克隆机制是创建对象副本的一种手段,分为浅克隆和深克隆。浅克隆只复制对象的基本类型字段,而引用字段指向的是原始对象的引用。深克隆则会递归地复制所有字段,包括引用类型的字段,确保副本与...

    java Clone

    `clone`方法分为两种类型:浅克隆(Shadow Clone)和深克隆(Deep Clone)。浅克隆是指只复制对象本身,而不复制其引用的对象。如果对象中包含其他对象的引用,那么这些引用的对象不会被复制,而是共享同一份引用。...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    克隆和序列化(Java )

    在Java中,克隆分为浅克隆和深克隆。浅克隆只是复制对象的引用,而深克隆则会创建对象以及所有嵌套对象的新副本。 2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅...

    Java深复制与浅复制&Clone

    在Java编程语言中,对象复制是一个常见的操作,...理解并正确使用浅复制和深复制对于开发高效、健壮的Java应用程序至关重要。在处理复杂的数据结构时,应根据需求选择合适的复制策略,以避免不必要的副作用和数据污染。

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    java 对象克隆

    在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。浅克隆创建的新对象只复制了原对象的引用,这意味着如果原对象中包含可变的引用类型,如数组或复杂的数据结构,那么新对象和原对象会...

    java中的指针,引用及对象的clone

    本文将深入探讨Java中的引用以及对象的克隆机制,包括浅拷贝和深拷贝的区别及其应用场景。 #### 二、Java中的引用 在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下...

Global site tag (gtag.js) - Google Analytics