zoukankan      html  css  js  c++  java
  • java的克隆

    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;
    }

    }

  • 相关阅读:
    【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
    【转】1.2 CDN的基本工作过程
    【转】 最新版chrome谷歌浏览器Ajax跨域调试问题
    【转】网段,子网掩码,网络标识,IP划分
    【转】默认网关有什么用?我应当怎么填写默认网关和DNS呢
    【转】DHCP工作过程详解
    【转】WINS服务器与DNS服务器有什么区别?
    46. Permutations 排列数
    30. Substring with Concatenation of All Words
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/hjy9420/p/4175279.html
Copyright © 2011-2022 走看看