JavaSE基础08(深浅克隆,缓存流,序列化流)

  • IO流
  • 浅拷贝(eclipse dome06  Teacher,Sudent,Easy)
  1. 克隆一个对象,只克隆自身的内存数据;
  2. 方法:
    1. 要克隆的对象要实现Cloneable接口;
    2. 重写clone方法,(clone是重写的Object类的);
    3. 会随着克隆对象的更改而更改,
    4. 浅拷贝不会生成新的内存空间,所以当原数据发生变化后,克隆的数据也会发生变化;
  3. String不能克隆,因为字符串常量池是减少新对象的创建;
  • 深拷贝
  1. 克隆一个对象,也将该对象引用的对象同时克隆;
  2. 方法:
    1. 要克隆的对象实现Cloneable接口;
    2. 重写clone方法;
      1. 把Object类型强制转换为具体的类型;
      2. 把属性对象强制转型;
      3. 把属性对象赋给类型的属性;
        public Object clone() throws CloneNotSupportedException {
                FreightStation ft=(FreightStation)super.clone();//把object类型强制转换
                Truck t=(Truck)truck.clone();//truck是Truck类型的变量
                ft.truck=t;
                return ft;
                }
    3. 在主方法中验证
              Object obj=ft.clone();//深拷贝
              FreightStation ft1=(FreightStation)obj;
              Truck t1=ft1.getTruck();
              t1.setName("小卡车");
  3. 会产生新对象的方法:
    1. new
    2. 反序列化
    3. 克隆
  • 缓存流
  1. 输入缓冲流 BufferedReader readLine()
  2. 输出缓冲流 BufferedWriter  writer()
    1. 提供一个8192大小的数组临时存放数据;
    2. BufferWriter为例: 每次执行Write方法写出的数据并没有直接写出而是临时存进数组中;
      1. 要存储的数据A没有8192大,写出数组中原来存储的数据,然后将A存到数组;
      2. 如果要写出的数据超过8192,会先把数组中的数据写出,然后再把A写出;
    3. 执行完成后要手动执行flush方法;
  • 序列化流
  1. 必须实现Serializable接口;
  2. 序列化出去的对象和反序列化的对象不是同一个对象;
  3. 使用serialVersionUID控制类型的序列化版本,如果该值发生变化,之前序列化出去的的数据,就不能反序列化回来;
  4. 序列化对象,这个对象中的属性以及保存(数组中)的数据也必须是可序列化的;
  5. String是可序列化的,但是不可以克隆;
  6. 如果类里面的成员变量不想被序列化到文件,需要在这个变量类型前面加transient;
  7. transient : 瞬态关键字,不会把当前的属性序列化/反序列化本地文件中;
  8. 修改了对象属性后序列号会发生变化,反序列化会报错,因为序列号发生变化不匹配;
  9. 解决方法:在Student中定义序列化的值,设置为私有静态常量 private static final long serialVersionUID =nL;
posted @ 2023-10-21 11:10  卡皮巴拉  阅读(15)  评论(0)    收藏  举报