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. hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)

    题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...

  2. JAVA-反射学习

    原文:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html 个人总结: 1. 反射是什么:由字节码文件(.class)获取 ...

  3. 1.Office 365系列(-)

    //来源:http://www.cnblogs.com/JessZhou/p/3470654.html 首先从Office 365开始. Office 365是微软云计划的一部分,主要包括sharep ...

  4. 一个快速、高效的Levenshtein算法实现——代码实现

    在网上看到一篇博客讲解Levenshtein的计算,大部分内容都挺好的,只是在一些细节上不够好,看了很长时间才明白.我对其中的算法描述做了一个简单的修改.原文的链接是:一个快速.高效的Levensht ...

  5. Mac下如何使用Vim

    帖子是转载的,原帖地址 Mac OX其实已经默认装好了vim了.不需要再安装Macvim https://ruby-china.org/topics/4905 Mac开发利器之程序员编辑器MacVim ...

  6. myeclipse连接数据库oracle(添加jdbc.properties)

    第一步:在src下面建一个包com.xsl.conf 第二步:在建好的包下面新建一个jdbc.properties 第三步:在jdbc.properties里写入内容如下: driver = orac ...

  7. Hibernate HQL查询语句总结

    Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";L ...

  8. JPA 系列教程 异常 集锦

    异常1.hibernate升级到3.5版本 异常信息摘要: Associations marked as mappedBy must not define database mappings like ...

  9. Error js内置错误 js处理错误流程 Throw语句

    Exceptional Exception Handling in JavaScript       MDN资料 Anything that can go wrong, will go wrong. ...

  10. Android编程获取手机的IMEI

    手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity).IMEI是由15位数字组成 ...