`

我也来谈Clone方法

阅读更多
JAVA中,函数的参数,是传值,对简单类型来说,是数值。
对对象来说,传的是对象的指针。

我记得刚到第一家公司的时候,还和别人争论过,我也查找了不少的国内国外文章。

Object上的Clone方法是一个本地方法,本地方法的运行速度很快。

子类只要实现了Clonable接口,并重载了Clone方法,
一般这样子重写:
public Object clone() {
		CloneC o = null;
		try {
			o = (CloneC) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}


如果该类的上面的每个子类都这样Override了Object的clone方法之后

那么执行该类的clone方法,相当于就是执行object上的clone方法

object上的方法,为什么能执行的快?其实很简单,在该类所在内存空间上

扫描一遍,复制那些值,在内存上的操作当然是最快速的了。所以clone速度才快嘛。

但此时应该注意到,你克隆出来的对象里的非简单类型,是一个指针,该指针指向的对象

和在被克隆的对象里的内存地址是一致的,这样也比较好理解,clone方法没必要为clone方法来假设你需要深度克隆,在内存管理上也可能存在着浪费。
所以你希望将非简单类型的数据和被克隆的里面的相对应的数据值相等,但是指针指向不一样的地址,实现所谓的深度克隆的话,应该要保证该类的内部非简单类型都实现了clone方法。
分享到:
评论

相关推荐

    浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    在实际应用中,我们可以根据具体情况选择使用clone()或Serialized方法来实现深拷贝。clone()方法需要我们手动实现clone()方法,并将所有涉及到的类实例clone一遍,而Serialized方法可以自动将对象转换为字节流,并...

    C#面向对象设计模式纵横谈(5)

    3. **使用原型**:在客户端代码中,你可以获取一个原型对象的实例,然后调用其`Clone`方法来创建新的对象。 ```csharp Prototype original = new ConcretePrototype(); original.Property = "Original Value"; ...

    C#面向对象设计模式纵横谈(

    3. **深拷贝与浅拷贝**:原型模式中的`Clone`方法可以通过`.NET`框架中的`MemberwiseClone()`方法实现浅拷贝,也可以通过序列化实现深拷贝。 4. **与其他创建型模式的关系**: - **Singleton**模式解决了对象唯一性...

    JavaScript深度复制(deep clone)的实现方法

    谈到代码复用的时候,很有可能想到的是代码的继承性(inheritance),但重要的是要记住其最终目标——我们要复用代码。继承性只是实现代码复用的一种手段,而不是唯一的方法。复制属性也是一种复用模式,它跟继承性是...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) (Level 300)

    在这个例子中,`ConcretePrototype1`实现了`IPrototype<ConcretePrototype1>`接口,并重写了`Clone()`方法来创建深拷贝。客户端代码创建了一个原型对象,然后通过调用`Clone()`方法创建了它的副本。由于克隆是深拷贝...

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    不过需要注意的是,`ICloneable.Clone()`方法默认只提供浅复制,即复制对象的引用,而不是对象的内容。如果需要深度复制(即复制对象内部的所有嵌套对象),则需要在实现`Clone()`方法时进行额外处理。 ```csharp ...

    【ASP.NET编程知识】浅谈.net平台下深拷贝和浅拷贝.docx

    在这个例子中,`ClassB` 的 `Clone()` 方法通过调用 `Member.Clone()` 来为 `Member` 字段创建一个深拷贝。 ### 应用场景 选择使用深拷贝还是浅拷贝取决于具体需求。如果对象的字段只包含值类型或者不需要独立于...

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List(); oldList.Add(..); List<T> newList = new List... public static IList<T> Clone(t

    浅谈C#中List<T>对象的深度拷贝问题

    可以定义一个扩展方法,要求List中的T实现ICloneable接口,然后遍历列表,对每个元素调用Clone()方法创建新对象。这样可以确保每个元素都被复制到新列表中,而不是共享相同的引用。 ```csharp static class ...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在C#中,我们可以通过实现`ICloneable`接口或利用`System.MemberwiseClone()`方法来实现原型模式。 首先,让我们理解原型模式的基本概念。原型模式是一种行为设计模式,它允许我们复制现有对象而不必知道其具体类。...

    浅谈jquery高级方法描述与应用

    `clone()`方法用于复制一个或多个元素,`appendTo()`则将这些元素添加到目标位置。在给出的例子中,`.hello`被克隆并附加到`.goodbye`内部,使得`.hello`元素出现在`.goodbye`的开头。 以上就是jQuery中的高级方法...

    浅谈Java中复制数组的方式

    另一种方法是使用 clone 方法来复制数组。这方法可以生成一个新的数组副本,而不是简单地复制引用。 ```java int[] src = {1, 3, 5, 6, 7, 8}; int[] dest; dest = (int[]) src.clone(); ``` 需要注意的是,使用 ...

    浅谈Java程序的性能优化

    对于数组,也可以通过复制已有数组来避免频繁的新建。 2. **谨慎处理异常**:异常处理虽然方便,但异常对象的创建和堆栈回溯过程会带来较大的性能损失。若能用条件语句解决问题,应避免使用异常。 3. **避免重复...

    浅谈jQuery中事情的动态绑定

    为解决这个问题,可以使用clone()方法,并设置参数为true,以克隆事件。 2. **live()方法** live()方法在旧版jQuery中被设计用来处理动态生成的元素的事件绑定。如下所示: ```javascript $('.scv').live('click...

    浅谈利用VMware搭建网络安全虚拟实验平台.pdf

    具体操作包括启动VMware Workstation软件,右击已创建的虚拟机,选择"Clone"命令,然后选择克隆的状态和方式,最后点击"Next"按钮完成克隆过程。 在教学过程中,虚拟实验平台具有以下优点:支持多种操作系统,允许...

    javascript 拷贝节点cloneNode()使用介绍.docx

    - **jQuery深拷贝Json对象**:jQuery库提供了一些方便的方法来处理DOM操作,包括克隆节点。例如,可以使用`$.extend(true, {}, obj)`来进行深拷贝。 - **JS深度拷贝Object/Array实例分析**:除了DOM节点外,...

Global site tag (gtag.js) - Google Analytics