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