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

    }

  • 相关阅读:
    用jquery判断当前显示器的分辨率,加载不同CSS
    [置顶] Android SDK下载和更新失败的解决方法!!!
    [置顶] 最全的Android开发开发资料
    [置顶] Android入门教程导入现有Android工程
    [置顶] 用Android访问本地站点(localhost,10.0.2.2)
    [置顶] Android入门教程Android工程目录结构介绍
    [置顶] 解决Android解析图片的OOM问题
    [置顶] Android入门教程环境搭建
    [置顶] Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)
    Windows 8 平板电脑体验及思考
  • 原文地址:https://www.cnblogs.com/hjy9420/p/4175279.html
Copyright © 2011-2022 走看看