程序如下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Test { public static void main(String[] args) throws Exception {
Banana2 b = new Banana2();
File file = new File("d:/test.txt");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
oos.writeObject(b);
oos.close();
ois.readObject();
ois.close();
System.out.println( " restored " + b.size + " " );
}
}class Food {
Food() {
System.out.print(" 1 ");
}
}class Fruit extends Food implements Serializable {
private static final long serialVersionUID = 2387924016119347282L; Fruit() {
System.out.print(" 2 ");
}
}class Banana2 extends Fruit {
private static final long serialVersionUID = 7689053551729518274L;
int size = 42;
}运行结果: 1 2 1 restored 42
谁解释哈1 2后面那个1怎么出的啊,我百思不得其解。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Test { public static void main(String[] args) throws Exception {
Banana2 b = new Banana2();
File file = new File("d:/test.txt");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
oos.writeObject(b);
oos.close();
ois.readObject();
ois.close();
System.out.println( " restored " + b.size + " " );
}
}class Food {
Food() {
System.out.print(" 1 ");
}
}class Fruit extends Food implements Serializable {
private static final long serialVersionUID = 2387924016119347282L; Fruit() {
System.out.print(" 2 ");
}
}class Banana2 extends Fruit {
private static final long serialVersionUID = 7689053551729518274L;
int size = 42;
}运行结果: 1 2 1 restored 42
谁解释哈1 2后面那个1怎么出的啊,我百思不得其解。
反序列化出来的,只会有一个Banana2实例,不会有Fruit实例出现,更不会有Food的实例出现。请注意,调用父类的构造函数(即super()),不会创建一个父类的实例。在jvm指令集中,super()对应的指令是invokespecial, 创建实例只有一个指令,那就是new。
Food() {
System.out.print(" 1 ");
new Exception().printStackTrace();
}
}
运行后打印出方法栈如下:
java.lang.Exception
at Food.<init>(Test.java:26)
at sun.reflect.GeneratedSerializationConstructorAccessor2.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.io.ObjectStreamClass.newInstance(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Test.main(Test.java:17)
=================================================================================
接下来保持Food类如上不变,将实现Serializable接口的类改成Banana2,运行,打印如下:java.lang.Exception
at Food.<init>(Test.java:26)
at Fruit.<init>(Test.java:33)
at sun.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Uknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.io.ObjectStreamClass.newInstance(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Test.main(Test.java:17)
你可能注意到了两次动态创建的隐藏构造器是不一样的。暂时我也就挖掘到这里
这就是sun的scjp考试的考题,考的都是一些变态题,郁闷啊