Question 101
Assuming that the serializeBanana2() and the deserializeBanana2() 
methods will correctly use Java serialization and given: 
13. import java.io.*; 
14. class Food {Food() { System.out.print(“1”); } 
15. class Fruit extends Food implements Serializable { 
16. Fruit() { System.out.print(“2”); } 
17. public class Banana2 extends Fruit { int size = 42; 
18. public static void main(String [] args) { 
19. Banana2 b = new Banana2(); 
20. b.serializeBanana2(b);                  // assume correct serialization 
21. b = b.deserializeBanana2(b);        // assume correct 
22. System.out.println(“ restored “+ b.size + ““)
23. // more Banana2 methods 
24. } 
What is the result? 
A. Compilation fails. B. 1 restored 42 
C. 12 restored 42 
D. 121 restored 42 
E. 1212 restored 42 
F. An exception is thrown at runtime. 
Answer: D问题一:我选的是C,不明白为什么还会多一个“1”出来。
问题二:还有,为什么把Line14改为:
14. class Food implements Serializable {Food() { System.out.print(“1”); }后,就会变成是C呢??
谢谢

解决方案 »

  1.   

    在main方法里,
    new Banana2(); 会输出 12,这没有问题。因为Food 并没有实现Serializable接口,而Fruit和Banana2都实现了Serializable接口,所以在序列化的时候,可以将Fruit和Banana2的信息序列化,而 Food 不行。当反序列化回来的时候,就要再走Food() { System.out.print("1");会再输出一个1,所以是D。 具体的LZ请参加API:public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和恢复超类型的公用 (public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此职责。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数构造方法。可序列化子类的字段将从该流中恢复。