Java查漏补缺2

Java查漏补缺2

Java对象的生命周期

Java中的对象都是存在于堆内存中的,而堆内存是可以被垃圾回收器不定期回收的。从对象被创建到被回收这一段时间就是Java对象的生命周期,也即Java对象只存活于这个时间段内。

对象序列化

如果我们需要保存某对象的状态,然后再在未来的某段时间将该对象再恢复出来,则必须要在对象被销毁即被垃圾回收器回收之前保存对象的状态。要保存对象状态,可以使用文件、数据库,也可以使用序列化。

要序列化某个类的对象,则该类必要实现Serializable接口,从Java API中我们发现该接口是个空接口,即该接口中没声明任何方法。
涉及到 Java 的 I/O 方面:主要用到两个类 FileOutputStream 和 ObjectOutputStream , FileOutputStream 用于将字节输出到文件, ObjectOutputStream 通过调用 writeObject 方法将对象转换为可以写出到流的数据。

import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.ObjectOutputStream;

流程:ObjectOutputStream 将要序列化的对象转换为某种数据,然后通过 FileOutputStream
连接某磁盘文件,再对象转化的数据转化为字节数据再将其写出到磁盘文件。

对象反序列化


import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;

用到的流是FileInputstream和ObjectInputstream正好与存储时用到的流相对应。从结果顺序可知,反序列化后得到对象的顺序与序列化时的顺序一致。

进行对象序列化主要目的是为了保存对象的状态(成员变量)

要将某类的对象序列化,则该类必须实现Serializable接口。
该接口仅是一个标志,告诉JVM该类的对象可以被序列化。
如果某类未实现Serializable接口,则该类对象不能实现序列化。
有时成员变量有可能是引用类型的,这时情况会稍加复杂。
当要对某对象进行序列化时,该对象中的引用变量所引用的对象也会被同时序列化,并且该对象中如果也有引用变量的话则该对象也将被序列化。
即在序列化的时候,对象中的所有引用变量所对应的对象将会被同时序列化。
引用变量类型也都要实现Serializable接口。
其他对象的序列化都是自动进行的。所以只需保证里面的引用类型是都实现Serializable接口即可。如若没有则会在编译时抛出异常。

如果序列化的对象中包含没有实现Serializable的成员变量,这时可以使用transient关键字,让序列化的时候跳过该成员变量。使用关键字transient可以让你在序列化的时候自动跳过transient所修饰的成员变量,在反序列化时这些变量会恢复到默认值。

如果某类实现了Serializable接口,其子类会自动编程可序列化

反序列化时不会调用对象的构造器

如果调用了构造器,对象的状态就会重新初始化,显然不合时宜。

静态变量不会被序列化

对象序列化的是为了保存对象的状态,即对象的成员变量,静态变量不会被序列化。

你可能感兴趣的:(Java实用教程笔记,java,后端)