Object中的clone方法

本文通过一个具体的Java示例详细介绍了如何实现对象的深克隆。为了能够使用Object类中的clone方法,一个类需要实现Cloneable接口。文章还提供了一个包含CloneDemo类的完整示例代码,展示了如何创建一个对象的克隆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若要使用Object对象中的clone方法需要实现Cloneable接口,

public class CloneObject {
public static void main(String[] args) {
CloneDemo obj1 = new CloneDemo(1);
CloneDemo obj2 = null;
try {
obj2 = (CloneDemo) obj1.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(obj1.getX());
System.out.println(obj2.getX());
}
}


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


private int x;


public CloneDemo(int x) {
super();
this.x = x;
}


public int getX() {
return x;
}

}

### C# 中 `Object.Clone` 方法详解 #### 1. 浅拷贝与深拷贝的概念 浅拷贝是指当一个对象被复制时,如果它包含的对象引用也被复制,则新的对象将会引用相同的子对象实例。这意味着对子对象的更改会影响原始对象以及其副本[^1]。 相反,深拷贝不仅复制了对象本身,还递归地复制了所有嵌套的对象。因此,在深拷贝的情况下,修改副本中的任何一个部分都不会影响到源对象[^3]。 #### 2. 使用 `MemberwiseClone()` 实现浅拷贝 在C#中,可以通过调用基类 `object` 提供的方法 `MemberwiseClone()` 来执行浅表级别的克隆操作。此方法会创建当前实例的一个新副本,其中基本数据类型会被逐位复制,而引用类型的成员则仅复制它们的引用地址而非实际内容[^2]。 ```csharp public class Person : ICloneable { public string Name { get; set; } public Address HomeAddress { get; set; } // 实现浅拷贝 public object Clone() => this.MemberwiseClone(); } ``` 这段代码展示了如何定义一个简单的 `Person` 类并实现 `ICloneable` 接口来提供浅拷贝功能[^4]。 #### 3. 序列化方式下的深拷贝 为了完成真正的深拷贝,一种常见的做法是利用 .NET 的序列化机制。具体来说就是先将对象序列化为字节流或其他形式的数据表示,再反序列化回内存中形成全新的独立实体。需要注意的是,这种方法要求参与序列化的所有类都标记为 `[Serializable]` 属性;否则可能会遇到运行时错误[^5]。 ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Employee : ISerializable, ICloneable { private int id; private string name; protected Employee(SerializationInfo info, StreamingContext context){ id = info.GetInt32("Id"); name = info.GetString("Name"); } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context){ info.AddValue("Id", id); info.AddValue("Name", name); } public virtual object Clone(){ using (MemoryStream ms = new MemoryStream()){ BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, this); ms.Position = 0; return bf.Deserialize(ms); } } } ``` 上述例子说明了一个更复杂的场景——自定义类实现了 `ISerializable` 和 `ICloneable` 接口以支持二进制格式的序列化过程,并以此为基础完成了深拷贝逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值