`

浅复制和深复制的代码实现

OO 
阅读更多


演示一:浅复制

public class Student implements Cloneable {
String name;
int age;

Student(String name, int age) {
this.name = name;
this.age = age;
}

public Object clone() {
Object o = null;
try {
o = (Student) super.clone();// Object中的clone()识别出你要复制的是哪一
// 个对象。
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}

public static void main(String[] args) {
Student s1 = new Student("zhangsan", 18);
Student s2 = (Student) s1.clone();
s2.name = "lisi";
s2.age = 20;
System.out.println("name=" + s1.name + "," + "age=" + s1.age);// 修改学生2后,不影响
// 学生1的值。
}
}

运行结果:name=zhangsan,age=18

演示二:浅复制不能同时复制引用

public class Professor {
String name;
int age;

Professor(String name, int age) {
this.name = name;
this.age = age;
}
}


public class Student1 implements Cloneable {
String name;// 常量对象。
int age;
Professor p;// 学生1和学生2的引用值都是一样的。

Student1(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
}

public Object clone() {
Student1 o = null;
try {
o = (Student1) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}

public static void main(String[] args) {
Professor p = new Professor("wangwu", 50);
Student1 s1 = new Student1("zhangsan", 18, p);
Student1 s2 = (Student1) s1.clone();
s2.p.name = "lisi";
s2.p.age = 30;
System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age);// 学生1的教授
// 成为lisi,age为30。
}
}

运行结果:name=lisi,age=30


演示三:将需要引用的对象也克隆一下做深复制

public class Professor1 implements Cloneable {
String name;
int age;

Professor1(String name, int age) {
this.name = name;
this.age = age;
}

public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}

运行结果:name=wangwu,age=50


演示四:利用串行化进行深复制

public class Professor2 implements Serializable {
String name;
int age;

Professor2(String name, int age) {
this.name = name;
this.age = age;
}
}


public class Student3 implements Serializable {
String name;// 常量对象。
int age;
Professor2 p;// 学生1和学生2的引用值都是一样的。

Student3(String name, int age, Professor2 p) {
this.name = name;
this.age = age;
this.p = p;
}

public Object deepClone() throws IOException, OptionalDataException,
ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}

public static void main(String[] args) throws OptionalDataException, IOException, ClassNotFoundException {
Professor2 p = new Professor2("wangwu", 50);
Student3 s1 = new Student3("zhangsan", 18, p);
Student3 s2 = (Student3) s1.deepClone();
s2.p.name = "lisi";
s2.p.age = 30;
System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age); // 学生1的教授不改变。
}

}

运行结果:name=wangwu,age=50

分享到:
评论

相关推荐

    深复制,浅复制区别c#代码

    本文将通过具体的C#代码示例来详细阐述深复制和浅复制的区别。 #### 浅复制(Shallow Copy) 浅复制是指创建一个新对象,并将其原始对象的引用类型成员直接指向原始对象的成员,而不是创建副本。这意味着,如果原始...

    java深复制浅复制的实现源代码

    本篇文章将深入探讨Java中的深复制和浅复制概念,并通过源代码示例进行详细解析。 首先,我们理解一下深复制和浅复制的区别: 1. **浅复制(Shallow Copy)**:浅复制只是复制了对象的引用,而不是对象本身。这...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    原型模式测试浅复制和深复制(C++)

    通过理解原型模式、浅复制和深复制的概念,以及在C++中如何实现它们,你可以有效地编写和移植使用这些概念的代码。对于给定的项目,可以打开`Prototype.cpp`和`main.cpp`,查看并分析实现以更好地理解这些概念的应用...

    Java中的深拷贝(深复制)和浅拷贝(浅复制) 示例代码

    为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...

    C#中的浅拷贝和深拷贝

    根据复制的方式不同,可以分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种复制方式各有其特点和适用场景。 #### 值类型变量与引用类型变量 在深入讨论浅拷贝与深拷贝之前,我们需要先理解C#中的两种基本...

    教你javascript克隆dom结点,浅复制结点,深复制结点

    总结,理解并掌握JavaScript中的DOM节点克隆,特别是浅复制和深复制的差异,对于编写高效且安全的前端代码至关重要。在实际开发中,根据需求选择合适的方法,可以避免不必要的性能开销,提高代码的可维护性。

    31.3、深复制和浅复制clone1

    总的来说,理解深复制和浅复制对于编写高效且无意外副作用的代码至关重要。在处理包含复杂数据结构的对象时,正确选择复制策略可以避免数据污染和不可预期的行为。在实际开发中,我们还需要考虑性能因素,因为深复制...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...

    Java深复制与浅复制&Clone

    可以使用序列化(Serialization)和反序列化(Deserialization)来实现深复制,或者手动编写代码递归复制所有属性。例如: ```java public class MyClass implements Serializable { private String str; private...

    Java中对象的深复制和浅复制详解.doc

    上述代码中的`Student`类实现了`Cloneable`接口,并重写了`clone()`方法,对`teacher`字段进行了深复制。这样,当对`clonedStudent`的`teacher`进行修改时,不会影响到原始`Student`对象的`teacher`。 在实际编程...

    iOS 深复制浅复制

    "深复制"和"浅复制"是两种不同的复制方式,它们在内存管理和对象引用上有着显著的区别。 首先,让我们理解“浅复制”(Shallow Copy)。浅复制是指创建一个新对象,这个新对象的指针指向的是原始对象中的数据的副本...

    C#095复制copy的应用 源代码.

    本主题将深入探讨C#中的复制概念,特别是通过`Copy`方法实现的浅复制和深复制。 首先,我们要理解什么是复制。复制一个对象意味着创建一个新的对象,它的属性值与原始对象相同。根据复制方式的不同,可以分为浅复制...

    Java 浅复制和深复制的实例详解

    在本文中,我们介绍了 Java 浅复制和深复制的实例详解,通过代码示例和结果分析,我们可以看到浅复制和深复制的区别和应用场景。浅复制适用于简单的对象复制,而深复制适用于需要完全复制对象的场景。

    java List 深度复制方法

    当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...

    java深度复制源代码

    在Java中,对象的复制分为浅复制和深度复制两种。浅复制是指创建一个新的对象,并将原对象的非引用类型的字段值复制到新对象中;对于引用类型的字段,只是复制了引用地址,即新旧对象共享同一份数据。而深度复制则是...

    理解java中的深复制和浅复制

    在Java编程中,深复制和浅复制是两个重要的概念,主要涉及到对象的复制与克隆。这两个术语在处理对象的拷贝时具有不同的含义,理解它们对于编写高效且无误的代码至关重要。 首先,让我们来看一下浅复制(Shallow ...

    C#浅拷贝深拷贝

    `CloneDemo`可能是一个示例项目,它包含了关于如何在C#中实现浅拷贝和深拷贝的代码。通过分析和运行这个项目,你可以更深入地理解这两种拷贝方式的区别和应用场景。 总结起来,C#中的浅拷贝和深拷贝是处理对象复制...

    数组、字典深复制

    了解如何在Objective-C或Swift中实现数组和字典的深复制,以及自定义对象如何遵循`NSCopying`协议,对于编写高效且可靠的代码至关重要。在实际项目中,合理运用深复制能够提高代码的稳定性和可维护性。

    易语言解决浅复制

    源码中可能包含了特定的算法或技术来实现深复制,确保复制的对象拥有独立的数据副本,不与原始对象共享内存。这通常通过逐个元素复制或使用特定的拷贝构造函数来实现。 "HOOK复制指针"是指使用钩子技术来拦截并处理...

Global site tag (gtag.js) - Google Analytics