`
hekuilove
  • 浏览: 158829 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

Java克隆,Object#clone()

阅读更多
在Java中要实现克隆很简单,只要在需要克隆的类实现Cloneable,并调用其clone方法即可。最简单的克隆如下
package cn.quinn.test;

public class TEST implements Cloneable {
	public String id;
	public T2 t2;
	public static void main(String[] args) {
		TEST t = new TEST();
		t.id = "1";
		try {
			TEST t2 = (TEST) t.clone();
			System.out.println(t);
			System.out.println(t2);
			System.out.println(t2.id);
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}

}


打印结果为
cn.quinn.test.TEST@1fb8ee3
cn.quinn.test.TEST@61de33
1
可以看到t和t2已经不是一个对象,但是id值相同。

Java中的克隆分为浅克隆和深克隆
默认的克隆方法提供的为浅克隆,浅克隆表现方式如下

package cn.quinn.test;

public class TEST implements Cloneable {

	public String id;

	public T2 t2;

	public static void main(String[] args) {
		TEST t = new TEST();
		T2 t21 = new T2(); //new一个属性对象
		t.t2 = t21;//把T2的对象传给t 
		System.out.println(t21); //打印一下
		try {
			TEST t2 = (TEST) t.clone();
			System.out.println(t2.t2); //克隆结果
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}

}


打印结果
cn.quinn.test.T2@61de33
cn.quinn.test.T2@61de33

两个对象完全相同,这就是浅copy,当更改克隆后的对象属性的值后会影响到克隆前的对象,因为它们是同一块内存地址。

在Java中如何实现深度克隆呢?

方法很多 可以重写属性类的clone方法 ,这样做不好的地方就是一旦对象属性过多就会写很多
最好的方法就是序列化和反序列化,不过所有的类和属性类都必须实现Serializable接口
如下
package cn.quinn.test;

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

public class TEST implements Cloneable, Serializable {

	public String id;

	public T2 t2;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		ByteArrayOutputStream byteout = null;
		ObjectOutputStream out = null;
		ByteArrayInputStream bytein = null;
		ObjectInputStream in = null;
		try {
			byteout = new ByteArrayOutputStream();
			out = new ObjectOutputStream(byteout);
			out.writeObject(this);

			bytein = new ByteArrayInputStream(byteout.toByteArray());

			in = new ObjectInputStream(bytein);

			return in.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (in != null) {
					in.close();
					in = null;
				}
			} catch (Exception e) {
			}
			try {
				if (bytein != null) {
					bytein.close();
					bytein = null;
				}
			} catch (Exception e) {
			}
			try {
				if (out != null) {
					out.close();
					out = null;
				}
			} catch (Exception e) {
			}
			try {
				if (byteout != null) {
					byteout.close();
					byteout = null;
				}
			} catch (Exception e) {
			}
		}
		return null;

	}

	public static void main(String[] args) {
		TEST t = new TEST();
		T2 t21 = new T2(); //new一个属性对象
		t.t2 = t21;//把T2的对象传给t 
		System.out.println(t21); //打印一下
		try {
			TEST t2 = (TEST) t.clone();
			System.out.println(t2.t2); //克隆结果
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}



package cn.quinn.test;

import java.io.Serializable;

public class T2 implements Serializable{

	private String t2;

	public String getT2() {
		return t2;
	}

	public void setT2(String t2) {
		this.t2 = t2;
	}

}

分享到:
评论

相关推荐

    Java中的克隆(Clone)机制

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

    java 深克隆 浅克隆

    浅克隆是通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来实现的。当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一...

    java深度克隆

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

    java 深克隆与浅克隆

    克隆机制的保护机制是通过在 Object 中将 Clone 方法申明为 protected 实现的,这样可以保证只有相应类内部才能“克隆”对象。例如,在 Employee 类中,可以申明 Clone 方法为 protected,以保证只有 Employee 类...

    java clone

    这个方法是Object类的一个成员,因此所有的Java类都默认拥有`clone`方法。不过,需要注意的是,`clone`方法并不执行深拷贝,也就是说,如果对象中包含引用类型的属性,这些引用指向的内存区域是共享的,不是完全独立...

    java Clone

    `clone`方法存在于Java的`java.lang.Object`基类中,所有Java类都默认继承自`Object`类,因此所有类都具备`clone`能力。 首先,要使用`clone`方法,我们需要确保类实现了`Cloneable`接口。`Cloneable`接口并没有...

    java 深克隆浅克隆

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

    Java深浅clone

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

    java clone的小例子

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

    JAVA浅克隆与深克隆

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

    java object 之clone方法全面解析

    Java中的`clone()`方法是Object类的一个成员方法,它提供了创建一个对象副本的功能。这篇文章将深入探讨`clone()`方法的工作原理、使用场景以及浅拷贝(shallow clone)与深拷贝(deep clone)的区别。 首先,让...

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

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

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

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

    java的深度克隆的例子

    在Java中,克隆操作是通过实现`Cloneable`接口和重写`Object`类的`clone()`方法来完成的。但需要注意的是,`clone()`方法默认执行的是浅克隆,因此如果对象中包含对其他对象的引用,这些引用不会被复制。为了实现...

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    克隆和序列化(Java )

    2. **浅克隆**:通过实现`Cloneable`接口并重写`Object`类的`clone()`方法,可以实现浅克隆。浅克隆只会复制对象自身的属性,如果对象中包含其他对象的引用,那么这些引用会被共享。 3. **深克隆**:深克隆需要递归...

Global site tag (gtag.js) - Google Analytics