java浅克隆与深克隆

概念:俗话就是拷贝一个副本

一般实现:

实现Cloneable 接口重写clone()方法

部分代码

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

注意:浅复制不能同时复制引用

如果需要复制引用将需要引用的对象也克隆一下做深复制

更好的方法是利用序列化(常说的串行化)来实现深复制(不需要实现Cloneable接口,需要实现Serializable接口)

见部分代码

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());
}

更多内容请关注微信公众号:IT哈哈(it_haha)

时间: 2024-10-06 16:25:32

java浅克隆与深克隆的相关文章

Java浅克隆和深克隆

什么是浅克隆和深克隆? 克隆顾名思义就是,参照一个东西再做一个出来 浅克隆:直接复写Object的clone()方法,默认情况下8种基本数据类型和String都会进行深克隆,另外的其他引用类型为浅克隆(浅克隆:引用指向的是同一个对象) 深克隆:浅克隆中那另外的其他引用类型都让其变为深克隆 引用类型图解 浅克隆 public class Main { public static void main(String[] args) throws Exception { A a = new A(); A

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方法即可:第二种情况就是,该对象中有其他对象的引用类型,此时只是前克隆就会失效,比如下述代码: