这是关于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/
分享到:
相关推荐
对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到...
在 Java 中,clone() 方法执行的是浅拷贝,浅拷贝只复制对象的基本类型属性,而不复制对象中的非基本类型属性。如果类中包含一些对象的时候,我们就需要深复制,就是在对对象的复制之后,急着对对象中的非基本类型的...
- Java提供了`Cloneable`接口来实现对象的深拷贝,但默认的`clone()`方法只进行浅拷贝。若需要深拷贝,需要自行实现拷贝逻辑。 6. **序列化与反序列化实现深拷贝** - 通过实现`Serializable`接口,可以利用`...
- 浅拷贝和深拷贝:浅拷贝只复制对象的引用,深拷贝则复制对象的内容。理解何时需要深拷贝,如何实现深拷贝,如使用clone()方法或序列化。 - **Serializable接口**:Java通过实现此接口进行序列化和反序列化,可...
Object 类中的 clone() 方法默认实现的是浅拷贝,但可以被重写以实现深拷贝。 JavaWeb 相关的知识点包括Servlet、JSP、过滤器、监听器等,它们是构建 Web 应用的基础。Spring 框架提供了依赖注入(DI)和面向切面...
7. **实现深拷贝**:实现`Cloneable`接口并重写`clone()`方法,或使用序列化和反序列化。 8. **对象相等性判断**:使用`equals()`方法,重写以比较对象内容而非引用。 9. **重写equals()**:比较对象属性值,通常...
- 浅拷贝与深拷贝:了解对象复制的不同层次,何时需要深拷贝,何时浅拷贝。 - `clone()`方法与`Serializable`接口的使用。 6. **Java Web**: - Servlet和Filter:理解请求处理流程,以及过滤器的实现。 - JSP...
- Java中有浅拷贝和深拷贝两种方式。浅拷贝仅复制对象的引用,而深拷贝会创建一个新的对象,复制所有字段的值。`Cloneable`接口和`clone()`方法用于实现对象拷贝,但通常需要自定义拷贝逻辑以满足特定需求。 8. **...
- `clone()`:允许对象进行浅拷贝或深拷贝,具体取决于实现细节。浅拷贝意味着复制对象本身,但不复制其内部的引用类型成员,而深拷贝则会递归复制所有引用类型的成员。 - `equals(Object obj)`:用于判断两个对象...
根据给定的文件信息,我们可以总结出以下关于Java学习的心得和重要知识点: ### Java学习心得及关键概念 #### 1. 对象与类的关系 Java是一种面向对象的语言,对象是类的一个实例,而类则是对象的模板。通过定义类...
对象拷贝涉及浅拷贝和深拷贝的概念。浅拷贝(对象的引用被复制)可以通过clone()方法或使用拷贝构造函数实现。深拷贝(对象和对象引用的所有子对象也被复制)通常需要自定义拷贝逻辑来完成。 ### JavaWeb Java Web...
11. **复制对象**:可以通过序列化和反序列化实现深拷贝,浅拷贝则通过构造器或clone()方法实现。 12. **覆盖与重载**:覆盖发生在子类中,要求方法名、返回类型和参数列表完全一致,且子类方法不能有更严格的访问...
Java提供了`clone()`方法支持浅拷贝,若需深拷贝则需自定义实现。 6. **适配器模式**:使接口不兼容的对象能够协同工作,其主要通过包装器或代理实现。在Java中,适配器模式常用于类的适配和接口的适配。 7. **...
`clone` 方法用于创建一个对象的浅拷贝或深拷贝。浅拷贝只会复制对象本身及其引用的值类型,而不会复制引用类型所指向的对象;深拷贝则会递归复制所有引用类型所指向的对象。 ### 28. 内部类 内部类(Inner Class...
- **定义**:实现`Cloneable`接口并重写`clone()`方法以实现对象的浅拷贝或深拷贝。 - **示例**: ``` public Object clone() { try { CounterSet obj = (CounterSet) super.clone(); obj.packets = (int[]) ...
在.NET中可以通过`Object`类的`MemberwiseClone()`方法来实现浅拷贝,或者通过序列化的方式来实现深拷贝。 2. **稳定接口**:要求“易变类”具备稳定的接口,以便在克隆过程中不会引入额外的复杂性。 #### 应用实例...
深拷贝与浅拷贝问题。 **22. Java中的异常处理机制?** - **异常:** 程序运行时发生的非正常情况。 - **处理机制:** try-catch-finally、throws关键字。 **23. Java中的线程安全机制?** - **线程安全:** 保证多...
**浅拷贝与深拷贝:** - **浅拷贝:** 只复制对象的基本数据类型成员变量,对于引用类型,只是复制其引用,而不是复制引用的对象。 - **深拷贝:** 复制所有成员变量,包括引用类型成员变量所引用的对象。 - **...