java有深拷贝和浅拷贝的区别。

浅拷贝:他是指拷贝该对象时,仅仅是拷贝了对象的本身(包括对象的基本数据类变量),不会拷贝引用数据类型的变量,也就是拷贝出来的新对象基本数据类型的值不变,引用数据类型的值发生改变。新对象还持有原对象所维护的所有对象的引用。也就是所A对象(原),他里面有B和C对象,还有int a=10,拷贝出来后,变成了A1对象,他里面还持有B1和C1的引用,还有int a1=10,但是B!=B1,C!=C1.浅拷贝调用的是Object的clone方法。而且这个对象要实现Cloneable,不然会抛出 java.lang.CloneNotSupportedException异常。

深拷贝:他指的是不仅拷贝对象本身,还拷贝了对象里所维护对象的引用,也就是上面的B==B1,C==C1,把对象的引用也拷贝了,还有基本数据类型。

首先该对象要实现Serializable接口。序列化。实现深拷贝可以将对象写到二进制字节流中,然后再从该二进制字节流读出来,或者将对象写到文件中,在从文件中读取出来。

//1.文件的方式

/**
* 读取文件
* @param file
*/
public static void readObjectByFile(File file,Student s){

try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
try {
Person person = (Person)ois.readObject();
if(person!=null)
System.out.println(person.getName());
System.out.println(person.getS()==s);//true
ois.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件没找到异常");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("输入输出异常");
e.printStackTrace();
}
}

//将对象写到文件中 二进制数据
public static File writeFileByObject(Object obj) throws IOException{
File file = new File("obj.txt");

FileOutputStream fos = new FileOutputStream(file);
//构建一个字节输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//构建一个对象输出流
ObjectOutputStream out = new ObjectOutputStream(bos);

out.writeObject(obj);

byte[] datas = bos.toByteArray();

fos.write(datas);

fos.close();

out.close();

return file;
}

//2.二进制字节流的方式   这里还有一些异常,可以抛出去吧

Person p = new Person("boy", 18, "深圳宝安");

//构建一个字节输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//构建一个对象输出流
ObjectOutputStream out = new ObjectOutputStream(bos);
//将对象写到字节流中
out.writeObject(p);
//将对象转换为字节
byte[] byteArray = bos.toByteArray();
//读取对象转换后的字节
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteArray));
try {
//获得对象
Person person = (Person)in.readObject();
System.out.println(person==p);
System.out.println(p.getS()==person.getS());//true
System.out.println(person.getAge());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
out.close();
in.close();

public class Person implements Serializable{

/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String address;

private Student s;

public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student getS() {
return s;
}
public void setS(Student s) {
this.s = s;
}

}

java的克隆的更多相关文章

  1. Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...

  2. 【转】Java如何克隆集合——深度拷贝ArrayList和HashSet

    原文网址:http://blog.csdn.net/cool_sti/article/details/21658521 原英文链接:http://javarevisited.blogspot.hk/2 ...

  3. Java基础——克隆

    1.克隆 假设有一个对象object1,在某处又需要一个跟object1一样的实例object2,这两个对象是绝对独立的,不会因为某一个修改另一个随之改变,这样,我们不能直接将对象objec1t的引用 ...

  4. java Clone()克隆

    转自:http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个 ...

  5. java对象克隆以及深拷贝和浅拷贝

    1.什么是"克隆"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不 ...

  6. (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    原文地址:http://blog.csdn.net/kenthong/article/details/5758884 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的 ...

  7. Java对象克隆详解

    原文:http://www.cnblogs.com/Qian123/p/5710533.html 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = appl ...

  8. 反射实现java深度克隆

    一.克隆 有时想得到对象的一个复制品,该复制品的实体是原对象实体的克隆.复制品实体的变化不会引起原对象实体发生变化,这样的复制品称为原对象实体的克隆对象或简称克隆. 1.浅复制(浅克隆) 概念:被复制 ...

  9. JAVA对象克隆可能会出现的问题

    首先,区分一下拷贝和克隆: 拷贝:当拷贝一个变量时,原始变量与拷贝变量引用的是同一个对象.当改变一个变量所引用的对象,则会对另一个变量造成影响. 克隆:当克隆一个对象时,是重新的创建了和该对象内容相同 ...

  10. java对象克隆复制

    原文链接:https://blog.csdn.net/ztchun/article/details/79110096 自己先简单描述总结一下:当想要将一个对象中已有的值直接给另外一个对象的时候,其实并 ...

随机推荐

  1. jquery验证表单是否满足正则表达式是否通过验证例子

    //验证通用函数 a表示元素对象,b表示正则表达式,c存bool值 function testyz(a,b,c){ c=false; $(a).on("blur",function ...

  2. OpenGL杂七杂八

    Projection Matrix 投影矩阵 3D -> 2D PFD_DOUBLEBUFFER 双缓冲 在图形图象处理编程过程中,双缓冲是一种基本的技术.我们知道,如果窗体在响应WM_PAIN ...

  3. js生成缩略图后上传并利用canvas重绘

    function drawCanvasImage(obj,width, callback){ var $canvas = $('<canvas></canvas>'), can ...

  4. [SOJ] 导游

    Description Mr. G. 在孟加拉国的一家旅游公司工作.他当前的任务是带一些游客去一些遥远的城市.和所有国家一样,一些城市之间有双向道路.每对相邻城市之间都有一条公交路线,每条路线都规定了 ...

  5. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  6. Php函数完整参考手册

    序号 分类 描述 1 Array 函数 2 Calendar 函数 日历扩展包含了简化不同日历格式间的转换的函数. 3 Date/Time 函数 Date/Time 函数用于从 PHP 脚本运行的服务 ...

  7. 利用GCD实现单利模式的宏代码

    以下是.h文件,使用时,直接在需要实现单例模式的类中导入头文件即可. // .h文件 #define DenglSingletonH(name) + (instancetype)shared##nam ...

  8. android studio的lib和jniLibs

    在android studio 中添加jar和so时,将jar文件直接拷贝到 项目目录\app\libs下即可,将so文件按照平台分类目录放到 项目目录\app\src\main\jniLibs\平台 ...

  9. C++实现中缀表达式转前、后缀

    #include<iostream> #include<string> #include<stack> using namespace std; bool isIn ...

  10. try{}catch{}finally{}的手记

    try{ System.out.println("执行try"); int = 6 / 0; return 1; }catch(Exception e){ System.out.p ...