clone 深拷贝 浅拷贝

1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性

2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set很多属性很麻烦

3. 实现:实现Cloneable接口(标识接口,里面没有方法的定义)标识该类对象可以克隆

重写Object中的clone()方法,该方法可以合法的(实现上面接口)对该类实例(对象)按字段进行复制。

在重写的clone()方法中 return super.clone(); (调用父类(Object)的clone方法,其实子类什么都没做)用父类的clone放复制当前对象的属性 返回复制的对象

4. 深拷贝,浅拷贝:对象属性有 基本类型 int String(不是基本但是final)等,引用变量(其他类的对象),因为基本基本类型变量的拷贝是值拷贝,引用变量的拷贝是拷贝的地址,所以克隆出来的对象的引用变量是同一个变量,在一个对象修改时,另一个对象也被修改,所以有了深拷贝。实现深拷贝需要把引用变量的对象的类也实现Cloneable接口,从写clone()方法,return super.clone();

5. 深拷贝好像用在java框架hibernate 上

/*
浅拷贝 s修改teacher s1的teacher也修改了
*/
package weiguoyuan.chainunicom.cn;

class Teacher1 {
    private String name;
    public Teacher1(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
}

class Student1 implements Cloneable{
    private String name;
    private Teacher1 teacher;
    public Student1(String name,Teacher1 teacher) {
        this.name = name;
        this.teacher = teacher;
    }
    public Teacher1 getTeacher() {
        return teacher;
    }
    public String toString() {
        return name+" "+teacher.toString();
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();

    }
}

public class TestClone {

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher1 t = new Teacher1("jianghongweiSB");
        Student1 s = new Student1("weiguoyuanNB",t);
        Student1 s1 = (Student1)s.clone();
        System.out.println(s);
        System.out.println(s1);

        s.getTeacher().setName("jianghongwei");
        System.out.println(s);
        System.out.println(s1);
    }
}
/**
 * 深拷贝实现
 */
package weiguoyuan.chainunicom.cn;

class Teacher1 implements Cloneable{
    private String name;
    public Teacher1(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

class Student1 implements Cloneable{
    private String name;
    private Teacher1 teacher;
    public Student1(String name,Teacher1 teacher) {
        this.name = name;
        this.teacher = teacher;
    }
    public Teacher1 getTeacher() {
        return teacher;
    }
    public String toString() {
        return name+" "+teacher.toString();
    }
    public Object clone() throws CloneNotSupportedException{
        Student1 student = (Student1)super.clone();
        student.teacher = (Teacher1)this.teacher.clone();
        return student;
    }
}

public class TestClone {

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher1 t = new Teacher1("jianghongweiSB");
        Student1 s = new Student1("weiguoyuanNB",t);
        Student1 s1 = (Student1)s.clone();
        System.out.println(s);
        System.out.println(s1);

        s.getTeacher().setName("jianghongwei");
        System.out.println(s);
        System.out.println(s1);
    }
}
时间: 2024-08-02 20:27:37

clone 深拷贝 浅拷贝的相关文章

java.lang.Object 之 clone() 深拷贝,浅拷贝

当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象. 如果希望传递的是对象的一个拷贝时,这时就需要用到object的clone()方法.拷贝对象返回的是一个新对象,而不是引用:拷贝对象与new操作符返回的新对象的区别就是这个拷贝对象已经包含了原来对象的一些信息,而不是对象的初始信息. 什么时候使用shallow Clone(浅拷贝,影子拷贝) ,什么时候使用 deep clone(深拷贝) :主要看具体域对象的性质是什么,如果是基本类型使用shallow clone ,

Java中的clone() 深拷贝 浅拷贝

上图展示了浅拷贝:对于非基本数据类型,clone过后,结果两个指针指向了同一块儿内存空间,所以仅仅是浅拷贝,这样的话如果对一个对象进行操作,另一个内容也会变,这显然是不合理的,应该每个对象分别保存自己的数据. 所以我们要进行深拷贝! 浅拷贝和深拷贝例子: import java.util.Vector; public class Student implements Cloneable{ private int id; private String name; private Vector co

c# 通用类型系统 深拷贝 浅拷贝 函数传参

c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下,变量在内存级的表现情况,对以后的coding应该有些帮助.在此记录以免忘记了... 1. 通用类型系统 先来一张图: 通用数据类型分为了值类型和引用类型. 我们定义一个int型实际上是一个system.int32的实例,在语法上我们像使用其他的类对象一样,但是,存储的的仍然是基本类型.这种把基本类型

深拷贝&浅拷贝

STRING.h文件 #pragma once #include<string.h> class String { public: String(char* str="")      //深拷贝 :_str(new char[strlen(str)+1]) { strcpy(_str, str); cout << "构造函数 " << endl; } ~String() { if (_str!=NULL) { delete[]_s

探讨一下iOS中深拷贝&amp;浅拷贝&amp;copy的那些事儿

什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是错误的? @property(nonatomic,copy)NSMutableString* name; copyWithZone方法又到底是干嘛用的? 接下来,我们将一起,一步一步的去揭晓问题的答案. Copy到底是个啥? 其实我们真的没必要把copy想的太高深.它之所以叫copy,其终极目的已不言而喻,

深拷贝 浅拷贝 引用计数

;深拷贝 浅拷贝 深拷贝(成员用到了指针存储空间地址)每个对象的成员都有自己独立的成员内存地址空间,造成了浪费 浅拷贝,把原对象的指针也直接拷贝过来我还是用的这一片空间,但是析构会有重复释放问题,解决重复释放用引用计数记录这个类产生了多少对象,析构的时候--引用计数就可以了 计数为0   delete 这块内存空间 ;引用计数技术 优点:所有对象共享同一片空间,间接的达到了对象间的数据共享 缺点:一旦一个对象改变了这片内存,那么所有的对象都受到影响 ;写时拷贝技术 当对象需要操作这一块空间存放数

深拷贝 浅拷贝 以及赋值运算符= 的重载

在一些程序当中,需要将一个对象里的值直接传递给另一个对象,需要进行对象的拷贝.但是在某些情况下也会出现错误,如类内部成员需要动态开辟内存,实行位拷贝,就是将一个对象的值完全复制给另一个对象,如A=B,但如果B中也有一个指针申请了内存,那么A中的成员变量也指向了同一块内存,如果当释放资源的时候,就会导致野指针的出现,出现错误. 深拷贝的简单理解 就是在复制对象内容的过程中,需要重新分配资源,而浅拷贝则是不要重新分配资源.但是浅拷贝存在着问题:当资源释放时会产生资源归属不清的问题,导致运行错误. 当

Java clone()深拷贝、浅拷贝

Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protected native Object clone() throws CloneNotSupportedException; 如果对象implement Cloneable接口的话,需要覆盖clone方法(因为Object类的clone方法是protected,需要覆盖为public) public Obj

Java 深拷贝浅拷贝 与 序列化

一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会进行拷贝:(引用的对象只要求浅拷贝即可:若要深层拷贝,一般可利用序列化和反序列化来实现,也可手动实现各级引用对象的深层拷贝:) 二.实现: 浅拷贝:实现Cloneable接口,重写clone()方法,在clone()调用父类super.clone()即可: 深拷贝:1. 实现Cloneable接口,