`
metaphy
  • 浏览: 344722 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

关于Java的“浅拷贝”和“深拷贝” (clone method)

 
阅读更多
这是关于Java的clone, 一些知道的和不知道的。

1. 调用Object类中clone()方法产生的效果是:先在内存中开辟一块和原始对象一样的空间,然后原样拷贝原始对象中的内容(也就是对clone对象各字段以=号赋值)。对基本数据类型,这样的操作是没有问题的,但对非基本类型变量,我们知道它们保存的仅仅是对象的引用,这也导致clone后的非基本类型变量和原始对象中相应的变量指向的是同一个对象。

2. 对于非基本类型和数组(Java中的数组变量,无论是基本类型数组还是非基本类型数组,都被看作是一个引用,指向实际分配的内存空间),都需要做深度clone,如果需要的话。

3. 使用new来对非基本类型和数组分配新空间,如下例:
	/**
	 * Get a copy of board[][]
	 */
	public byte[][] newCopyOfBoard() {
		byte[][] b = new byte[BOARD_HEIGHT][BOARD_WIDTH];
		for (int y = 0; y < BOARD_HEIGHT; y++) {
			for (int x = 0; x < BOARD_WIDTH; x++) {
				b[y][x] =boardArea[y][x] ;
			}
		}
		return b;
	}

	/**
	 * Board object Clone for AB search
	 */
	public Object clone() {
		Board bclone = null;
		try {
			bclone = (Board) super.clone();
			bclone.boardArea = this.newCopyOfBoard();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return bclone;
    }



4. 关于如何实现Clone,需要知道:
a) 类需要实现Cloneable接口
b) 重载clone方法
c) 重载使用super.clone方法,并对类内部的引用类型均要做clone

见下面的例子:
public class Fridge implements Cloneable{
	public int size; 
	public Cola cola = new Cola(); 
	
	public Object clone () {
		Fridge fridge = null; 
		try {
			fridge = (Fridge) super.clone();
			fridge.cola= (Cola) cola.clone(); 
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return fridge; 
	}
}


参考:
http://www.ibm.com/developerworks/cn/java/l-jpointer/
0
12
分享到:
评论

相关推荐

    java对象复制克隆

    对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到...

    java 中clone()的使用方法

    在 Java 中,clone() 方法执行的是浅拷贝,浅拷贝只复制对象的基本类型属性,而不复制对象中的非基本类型属性。如果类中包含一些对象的时候,我们就需要深复制,就是在对对象的复制之后,急着对对象中的非基本类型的...

    Java-Java面向对象中引用传递教程

    - Java提供了`Cloneable`接口来实现对象的深拷贝,但默认的`clone()`方法只进行浅拷贝。若需要深拷贝,需要自行实现拷贝逻辑。 6. **序列化与反序列化实现深拷贝** - 通过实现`Serializable`接口,可以利用`...

    Java:面试题大全带答案

    - 浅拷贝和深拷贝:浅拷贝只复制对象的引用,深拷贝则复制对象的内容。理解何时需要深拷贝,如何实现深拷贝,如使用clone()方法或序列化。 - **Serializable接口**:Java通过实现此接口进行序列化和反序列化,可...

    java初级面试题汇总(附答案).pdf

    Object 类中的 clone() 方法默认实现的是浅拷贝,但可以被重写以实现深拷贝。 JavaWeb 相关的知识点包括Servlet、JSP、过滤器、监听器等,它们是构建 Web 应用的基础。Spring 框架提供了依赖注入(DI)和面向切面...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    7. **实现深拷贝**:实现`Cloneable`接口并重写`clone()`方法,或使用序列化和反序列化。 8. **对象相等性判断**:使用`equals()`方法,重写以比较对象内容而非引用。 9. **重写equals()**:比较对象属性值,通常...

    Java 208道面试.docx

    - 浅拷贝与深拷贝:了解对象复制的不同层次,何时需要深拷贝,何时浅拷贝。 - `clone()`方法与`Serializable`接口的使用。 6. **Java Web**: - Servlet和Filter:理解请求处理流程,以及过滤器的实现。 - JSP...

    JAVA面试的相关问题

    - Java中有浅拷贝和深拷贝两种方式。浅拷贝仅复制对象的引用,而深拷贝会创建一个新的对象,复制所有字段的值。`Cloneable`接口和`clone()`方法用于实现对象拷贝,但通常需要自定义拷贝逻辑以满足特定需求。 8. **...

    JAVA高级应用

    - `clone()`:允许对象进行浅拷贝或深拷贝,具体取决于实现细节。浅拷贝意味着复制对象本身,但不复制其内部的引用类型成员,而深拷贝则会递归复制所有引用类型的成员。 - `equals(Object obj)`:用于判断两个对象...

    java 学习心得可以帮助大家

    根据给定的文件信息,我们可以总结出以下关于Java学习的心得和重要知识点: ### Java学习心得及关键概念 #### 1. 对象与类的关系 Java是一种面向对象的语言,对象是类的一个实例,而类则是对象的模板。通过定义类...

    JAVA 208道面试题.pdf

    对象拷贝涉及浅拷贝和深拷贝的概念。浅拷贝(对象的引用被复制)可以通过clone()方法或使用拷贝构造函数实现。深拷贝(对象和对象引用的所有子对象也被复制)通常需要自定义拷贝逻辑来完成。 ### JavaWeb Java Web...

    java面试.docx

    11. **复制对象**:可以通过序列化和反序列化实现深拷贝,浅拷贝则通过构造器或clone()方法实现。 12. **覆盖与重载**:覆盖发生在子类中,要求方法名、返回类型和参数列表完全一致,且子类方法不能有更严格的访问...

    java与模式

    Java提供了`clone()`方法支持浅拷贝,若需深拷贝则需自定义实现。 6. **适配器模式**:使接口不兼容的对象能够协同工作,其主要通过包装器或代理实现。在Java中,适配器模式常用于类的适配和接口的适配。 7. **...

    java30个应该掌握的基础

    `clone` 方法用于创建一个对象的浅拷贝或深拷贝。浅拷贝只会复制对象本身及其引用的值类型,而不会复制引用类型所指向的对象;深拷贝则会递归复制所有引用类型所指向的对象。 ### 28. 内部类 内部类(Inner Class...

    java编码规范,老师给的。

    - **定义**:实现`Cloneable`接口并重写`clone()`方法以实现对象的浅拷贝或深拷贝。 - **示例**: ``` public Object clone() { try { CounterSet obj = (CounterSet) super.clone(); obj.packets = (int[]) ...

    原型模式 Prototype Pattern

    在.NET中可以通过`Object`类的`MemberwiseClone()`方法来实现浅拷贝,或者通过序列化的方式来实现深拷贝。 2. **稳定接口**:要求“易变类”具备稳定的接口,以便在克隆过程中不会引入额外的复杂性。 #### 应用实例...

    java面试宝典

    深拷贝与浅拷贝问题。 **22. Java中的异常处理机制?** - **异常:** 程序运行时发生的非正常情况。 - **处理机制:** try-catch-finally、throws关键字。 **23. Java中的线程安全机制?** - **线程安全:** 保证多...

    程序员面试题

    **浅拷贝与深拷贝:** - **浅拷贝:** 只复制对象的基本数据类型成员变量,对于引用类型,只是复制其引用,而不是复制引用的对象。 - **深拷贝:** 复制所有成员变量,包括引用类型成员变量所引用的对象。 - **...

Global site tag (gtag.js) - Google Analytics