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. CodeForces 707B Bakery

    枚举. 枚举每一条边,如果发现边的一端$f[u]=1$,另一端$f[v]=0$,那么更新答案,取最小值就好了. #pragma comment(linker, "/STACK:1024000 ...

  2. 日期的本质是double

    日期的本质是double,在多语种时用起来更方便.

  3. 【angular】angular如何让传递变量参数+ng-change的使用

    HTML: <div class="form-group"> <label class="col-sm-2 control-label"> ...

  4. 按键精灵http.定义getWeb

    Function 取网页源码(URL) Set objXML=CreateObject("Microsoft.XMLHTTP") objXML.Open "Get&quo ...

  5. ABP组件包升级

    对于abp的爱好者来说在使用abp上会面临两个问题,第一个是如何上手,第二是如何升级,然而们今天的主题是如何升级abp的组件包.目前我项目版本是0.8.2 通过官网boilerplate生成的项目前端 ...

  6. WebStorm和IntelliJIEDA软件注册码网站(手动填写)

    很多人都发现 http://idea.lanyus.com/ 不能激活了 很多帖子说的 http://15.idea.lanyus.com/ 之类都用不了了 选择 License server (20 ...

  7. bootstrap页面模板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. HDU 5868 Different Circle Permutation(burnside 引理)

    HDU 5868 Different Circle Permutation(burnside 引理) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=586 ...

  9. 101个Linq例子(40-60)

    GroupBy - Simple 2 public void Linq41() { string[] words = { "blueberry", "chimpanzee ...

  10. C# 手机格式验证

    C# 手机格式验证 //电信手机号码正则 Regex dReg = new Regex(@"^1[3578][01379]\d{8}$"); //联通手机号正则 Regex tRe ...