码迷,mamicode.com
首页 > 编程语言 > 详细

java的克隆

时间:2014-12-20 14:02:13      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

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的克隆

标签:

原文地址:http://www.cnblogs.com/hjy9420/p/4175279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!