`

java clone 深度克隆 浅度克隆

    博客分类:
  • java
阅读更多
,在持久层操作时,有时需要操纵hibernate session内实例,但是又不想影响到原实例,这时克隆就必不可少.复制一份一样的实例.进行传值.

   克隆Object的方法.
  
 protected native Object clone() throws CloneNotSupportedException;

  
   CloneNotSupportedException表示你必须为你要克隆的类实现Cloneable接口
  
public interface Cloneable 

  例子一,User类
package com.ming.test.three;

public class User implements Cloneable{
	private String username;
	private Integer age;
	private int sex;
	private Car car;
	public User(String username,Integer age,int sex,Car car){
		this.username = username;
		this.age = age;
		this.sex = sex;
		this.car = car;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		 // TODO Auto-generated method stub  
        User u = (User)super.clone();  
        //u.setUsername(new String(username));//在这里你可以进行重新生成注入进去  
        //u.setAge(new Integer(age));//在这里进行改良  
        //----如果是自定义类型  
        //u.setCar((Car)car.clone());//car 是你当前克隆对象的属性,而且Car必须实现Cloneable接口  
        return u; 
	}
	
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

Car 类
package com.ming.test.three;

import java.io.Serializable;

/**
 * @author user
 *
 */
public class Car implements Cloneable{

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}

   测试类,Test
package com.ming.test.three;
package com.ming.test.three;

public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		User u = new User("jacky",11,1,new Car());
		User u1 = (User)u.clone();//克隆一份
		System.out.println(u==u1);//false 表示重新生成了一份
		System.out.println(u.getUsername()==u1.getUsername());//true 表示引用类型 只是copy了栈的引用为重新复制 这为浅克隆
		System.out.println(u.getCar()==u1.getCar());//true
	}
}


    深克隆的实现方式,对于引用类型的复制,必须要深度克隆,一下有俩种方式实现。
1.在你需要clone的类中

   
@Override
	protected Object clone() throws CloneNotSupportedException {
		 // TODO Auto-generated method stub  
        User u = (User)super.clone();  
        u.setUsername(new String(username));//在这里你可以进行重新生成注入进去  
        u.setAge(new Integer(age));//在这里进行改良  
  
        //----如果是自定义类型  
        u.setCar(car.clone());//car 是你当前克隆对象的属性,而且Car必须实现Cloneable接口  
        return u; 
	}


2.实现 implements Serializable
 
   User类
package com.ming.test.three;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class User implements Cloneable, Serializable{
	
	/**	 */
	private static final long serialVersionUID = 8574879580125565714L;
	
	private String username;
	private Integer age;
	private int sex;
	private Car car;
	public User(String username,Integer age,int sex,Car car){
		this.username = username;
		this.age = age;
		this.sex = sex;
		this.car = car;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		 // TODO Auto-generated method stub  
        User u = (User)super.clone();  
       // u.setUsername(new String(username));//在这里你可以进行重新生成注入进去  
        //u.setAge(new Integer(age));//在这里进行改良  
        //----如果是自定义类型  
       // u.setCar((Car)car.clone());//car 是你当前克隆对象的属性,而且Car必须实现Cloneable接口  
        return u; 
	}
	
	public Object deepCopy() throws IOException, ClassNotFoundException{  
	     ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	     ObjectOutputStream oos;
	     ObjectInputStream ois = null;
		 oos = new ObjectOutputStream(bos);
		 oos.writeObject(this);
		 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
		 ois = new ObjectInputStream(bis);
	    return ois.readObject();  
	}  
	
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}

    Car类
 
package com.ming.test.three;

import java.io.Serializable;

/**
 * @author user
 *
 */
public class Car implements Cloneable, Serializable{

	/**	 */
	private static final long serialVersionUID = -740464901844332572L;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}

Test类
package com.ming.test.three;

public class Test {
	public static void main(String[] args) throws CloneNotSupportedException {
		//-----深度克隆
		Car  car = new Car();
		User u2 = new User("ming",111,11,car);
		try {
			User u3 = (User) u2.deepCopy();
			System.out.println(u3==u2);//false
			System.out.println(u3.getCar()==u2.getCar());//false
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}
分享到:
评论

相关推荐

    clone 深度克隆对象

    在Java中,实现深度克隆通常有两种方式:一是通过实现Cloneable接口并重写Object类的clone()方法;二是使用序列化和反序列化技术。前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,...

    java深度克隆

    ### Java深度克隆详解 #### 一、引言 在Java开发过程中,对象拷贝是一项常见操作。根据拷贝程度的不同,对象拷贝通常分为浅拷贝和深度拷贝两种类型。浅拷贝只复制对象的基本属性,而深度拷贝不仅复制基本属性,还...

    java的深度克隆的例子

    在Java编程语言中,"深度克隆"是一个重要的概念,主要涉及到对象复制。深度克隆,也称为完全克隆,是指创建一个与原对象相同的新对象,不仅复制原对象的所有属性,还复制了原对象中引用的对象。这通常用于创建一个...

    解析JAVA深度克隆与浅度克隆的区别详解

    Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    深入JAVA对象深度克隆的详解

    Java对象的深度克隆是一种创建一个新对象的过程,该新对象与原始对象具有相同的数据,但两者之间相互独立,修改其中一个对象不会影响另一个。在Java中,深度克隆与浅克隆的区别在于处理对象内部引用的复杂性。浅克隆...

    java clone的小例子

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

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

    浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double等),则这些成员变量会被逐个复制到新创建的对象中。然而,如果成员变量是引用类型(对象),那么新对象和原对象...

    深度克隆的事例代码

    在Java、JavaScript、Python等编程语言中,都有实现深度克隆的方法。下面我们将分别探讨这些语言中的深度克隆技术。 ### Java中的深度克隆 在Java中,我们可以利用序列化和反序列化来实现深度克隆。首先,我们需要...

    java克隆对象(两种方法)

    java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)

    java clone

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

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    JAVA浅克隆与深克隆

    在Java编程语言中,克隆是创建一个对象副本的过程,这个副本与原对象有相同的属性值,但作为不同的对象存在。克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆...

    java 深克隆浅克隆

    实现深克隆通常需要自定义实现,因为Java的`clone()`方法不支持自动深度克隆。一种常见的实现方法是序列化和反序列化对象。首先,将对象序列化为字节数组,然后从字节数组反序列化为新的对象。这种方法可以保证所有...

    java 深克隆 浅克隆

    为了实现深克隆,通常需要自定义克隆逻辑,因为`Object`的`clone()`方法无法处理引用类型的深度复制。这通常涉及序列化和反序列化的过程,或者手动复制每个引用类型的字段。 例如: ```java class DeepCloneExample...

    java 深克隆与浅克隆

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

Global site tag (gtag.js) - Google Analytics