以下问题(Sierra Bates SCJP指南)的答案是pcp:
import java.io.*;
class Player {
Player() { System.out.print("p"); }
}
class CardPlayer extends Player implements Serializable {
CardPlayer() { System.out.print("c"); }
public static void main(String[] args) {
CardPlayer c1 = new CardPlayer();
try {
FileOutputStream fos = new FileOutputStream("play.txt");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(c1);
os.close();
FileInputStream fis = new FileInputStream("play.txt");
ObjectInputStream is = new ObjectInputStream(fis);
CardPlayer c2 = (CardPlayer) is.readObject();
is.close();
} catch (Exception x ) { }
}
}
因此它得到了pcp:
“ pc”被打印为Cardplayer的序列化状态-继承的p和Cardplayer的c。输出中的第三个p是超类Player构造函数运行的结果-因为它不可序列化-打印p。
这是怎么得出答案的?
最佳答案
答案是肯定的。
Java doc of Serializable
为了允许对不可序列化类的子类型进行序列化,该子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段状态的责任。仅当其扩展的类具有可访问的无参数构造函数以初始化类的状态时,该子类型才可以承担此责任。如果不是这样,则声明一个可序列化的类是错误的。将在运行时检测到错误