Java浅克隆和深克隆

什么是浅克隆和深克隆?

克隆顾名思义就是,参照一个东西再做一个出来

浅克隆:直接复写Object的clone()方法,默认情况下8种基本数据类型和String都会进行深克隆,另外的其他引用类型为浅克隆(浅克隆:引用指向的是同一个对象)
深克隆:浅克隆中那另外的其他引用类型都让其变为深克隆

引用类型图解

浅克隆

public class Main {

    public static void main(String[] args) throws Exception {

        A a = new A();
        A b = (A)a.clone();
        b.str = "....";
        b.i = 1000;

        System.out.println(a == b); //false 表示地址并不一样,不是同一个引用
        System.out.println(a.p == b.p); //true 表示引用类型只想的是同一个引用
        System.out.println(a.str == b.str); //false 表示地址并不一样,不是同一个引用
        System.out.println(a.i == b.i);    //false 表示地址并不一样,不是同一个引用
    }

}

//克隆对象需要实现Cloneable接口
class A implements Cloneable {
    Person p = new Person("谭迪");
    String str = "hehe";
    int i = 100;

    //浅克隆:该方法来自于Object
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Person{
    String name;
    public Person(String name) {
        this.name = name;
    }
}

深克隆

public class Main {

    public static void main(String[] args) throws Exception {

        A a = new A();
        A b = (A)a.clone();

        b.str = "....";
        b.i = 1000;

        System.out.println(a == b);         //false
        System.out.println(a.p == b.p);     //flase
        System.out.println(a.str == b.str); //flase
        System.out.println(a.i == b.i);     //flase
    }

}

//克隆对象需要实现Cloneable接口
class A implements Cloneable {
    Person p = new Person("小明");
    String str = "hehe";
    int i = 100;

    //深克隆:该方法来自于Object
    @Override
    protected A clone() throws CloneNotSupportedException {
        A a = (A)super.clone();
        a.p = (Person)p.clone();
        return a;
    }
}

class Person implements Cloneable{
    String name;
    public Person(String name) { this.name = name; }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

原文地址:https://www.cnblogs.com/tandi19960505/p/8169504.html

时间: 2024-10-20 12:41:42

Java浅克隆和深克隆的相关文章

java浅克隆与深克隆

概念:俗话就是拷贝一个副本 一般实现: 实现Cloneable 接口重写clone()方法 部分代码 public Object clone() {     Object o = null;     try {         o = (Student) super.clone();// Object中的clone()识别出你要复制的是哪一         // 个对象.     } catch (CloneNotSupportedException e) {         System.ou

Java中的深克隆和浅克隆——Cloneable接口

一.没有使用克隆带来的问题 public class CloneTest { static Student s = new Student("aaa", 20); // 直接赋值带来的问题 public static void noclone() { // 传的是引用的副本,改变了noCloneStudent也改变了s Student noCloneStudent = new Student(); noCloneStudent = s; noCloneStudent.setName(&

java基础入门-对象的浅克隆与深克隆

这里面涉及到两个类,一个是person类,一个是测试类test 首先我们说到的是浅克隆,对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,如果是基本数据类型(int,float,char等)到没什么问题,基本遇上如string,Integer等不可变对象的时候也没有什么问题,但是如果遇上了date这个可变对象,或者是自己定义的可变对象,他只是简单的复制一下引用这些可变对象,而不是把这些可变对象再一次的复制 先上person类,这里面虽然是实现Cloneable接口,

java(30) - 对象浅克隆和深克隆

一.浅克隆和深克隆的概念:        1).浅克隆:又称为浅复制,被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换而言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 2).深克隆:又称为深复制,被复制的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换而言之,深复制就是把要复制的对象所引用的对象都复制了一遍. 二.浅克隆实现: <pre

Java中的深克隆和浅克隆

为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保存当前对象的"状态"时就要靠克隆了. 当然, 把对象的属性一个一个的赋值给新new的对象也是可以的, 但是这样一来麻烦不说, 二来, 我们通过源码查看 Object的clone方法是一个native方法(native方法是非Java语言实现的代码, 供Java程序调用, 要想访问比较底层的

[C#]浅克隆和深克隆的区别和在C#中的体现形式

前言:我们知道对象分引用类型和值类型. 浅克隆:复制一个现有对象,引用类型指向同一个内存块(string为最特殊的对象,这里当作值类型来看先) public class User { public int Age { get; set; } public string UserName { get; set; } public List<string> List { get; set; } public User ShallowCopy() { return this.MemberwiseCl

c#:浅克隆和深克隆,序列化和反序列化

一.浅克隆和深克隆(浅复制和深复制)浅克隆和深克隆最典型的应用是数据集对象DataSet的Clone和Copy方法.Clone()方法用来复制DataSet的结构,但是不复制DataSet的数据,实现了浅复制.Copy()方法不但复制结构,也复制数据,实现了深复制.另外:我们熟知的Object对象有一个MemberwiseClone()方法,它实现的就是浅表复制.该方法不是虚拟的,所以不能重写它的实现代码.1.浅克隆:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然

原型模式(克隆模式)—浅谈浅克隆与深克隆

克隆是什么?它的产生背景? 当new的对象是多例的时候,new对象将会不断占据内存.特别是消耗内存的大对象,比如数据库连接等.平时运用的不多,只在spring等容器有见过,此处不多赘述,了解即可. 浅克隆与深克隆是什么意思?通过案例逐步探讨. public class Star implements Cloneable,Serializable{ private String name; private Date birthday; public Star(){} public Star(Str

浅谈Java中的浅克隆与深克隆

在程序开发中如果已经存在一个对象A,现在需要一个与A对象完全相同的对象B,并对B对象的属性值进行修改,但是A对象原有的属性值不能改变.这是,如果使用Java提供的对象赋值语句,修改B对象的属性值后,A对象的属性值也将被修改.那么此时就应该想到要用java的clone方法去实现. 此时会遇到两种情况:第一种情况是,该对象中所有属性都是基本类型没有引用类型,这时就可以只重写Cloneable接口的clone方法即可:第二种情况就是,该对象中有其他对象的引用类型,此时只是前克隆就会失效,比如下述代码: