浅clone复制的是栈的内容,如果你复制对象中存在对其他对象的引用,它只是复制那个引用,而不会去复制引用指向的对象。
也就是如果a是b的浅clone对象,那么你修改a之内的对象的引用,就会造成b的变化,因为他们都指向同一个对象。
深clone就是彻彻底底的做了一个新对象,a,b完全独立。
/**
* @(#)DeepClone.java
*
*
* @author leo
* @version 1.00 2008/3/10
*/
import java.io.Serializable;
import java.io.IOException;
import java.io.OptionalDataException;
import java.io.*;
public class DeepClone implements Serializable {
public DeepClone() {
}
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 Exception {
DeepClone dc = new DeepClone();
DeepClone dc1 = (DeepClone) dc.deepClone();
System.out.println(dc);
System.out.println(dc1);
}
}
注意:如果被克隆对象内部含有其他对象的引用,那么这些引用所代表的类也要实现Serializable接口。
实现的方法就是
就是在重写的clone方法中,除了调用super.clone()
还要调用当前引用的clone()
Java code
class A{
int m;
}
class B
{
int i;
A a = new A();
public Object clone() {
B obj = null;
try {
obj = (B)super.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
// 就是这句
obj.a = (A)obj.a.clone();
return obj;
}
}
要记得这两个类要实现cloneAble
分享到:
相关推荐
java 深克隆 浅克隆
学习java深克隆与浅克隆,希望对你有用
Java对象的深克隆与浅克隆详解.zip
java 深克隆浅克隆···············
浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建
NULL 博文链接:https://gegeyi.iteye.com/blog/1562016
在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。
主要介绍了java 对象的克隆的相关资料,这里对浅克隆和深克隆进行了实例分析需要的朋友可以参考下
如何深克隆呢? 正文 public class good{ private good(){ oneclass=new class{ int id=8; string name='id'; } } private static good __good; private static good __good=new good(); public good ...
用C++写的代码,基于VS2008平台写的,可以转换到VC6下,主要拿Prototype.h和Prototype.cpp以及main.cpp修改即可,目的是写来测试浅复制和深复制的区别的。
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
什么是克隆 其实js里的克隆跟生活里说的克隆是一样的。有一个本体,克隆出跟本体一摸一样的副体,当本体“受伤”时副体是不会“受伤”的,js的克隆也是如此。 来看下面代码 var benti = { top: 铁头, leg: 大长...
主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下
注意: 需要JDK1.8及以上 Bean需要提供无参数的构造方法~ 以下代码存在于项目的com.brucecloud.fastclone.example包下~ 示例Bean.java 公共类ExampleBean { 私有 int id; 私人用户用户;... 公共字符串 getName() {
浅克隆: package testclone; public class ShallowClone implements Cloneable { public String name; public String[] name2; public ShallowClone() { name2 = new String[2]; } public Object clone() {...
惰性深克隆,高性能的js克隆 传统的深拷贝做法 JSON.parse(JSON.stringify(data)) 递归浅拷贝 第一种做法存在一些局限,很多情况下并不能使用,因此这里就不提了;第二种做法一般是工具库中的深拷贝函数实现方式,...
深拷贝-ts 用于 typescript/javascript 的递归深拷贝、克隆和浅拷贝函数基于 MIT 和 LGPL 许可证可用。
教你javascript克隆dom,浅复制dom,深复制dom
android 浅复制和深复制-Java Generic Deep Copy 篇
本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下