主题:[原创]SCJP考试试题解析一
SCJP考试试题解析一
我的QQ号:2535279
我的QQ群:58591592
www.javaedu.com.cn
import java.io.*;
public class Forest implements Serializable{
private Tree tree = new Tree();
public static void main(String[] args){
Forest f = new Forest();
try{
FileOutputStream fs = new FileOutputStream("Forest.Ser");
ObjectOutputStream os=new FileOutputStream(fs);
os.writeObject(f);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class Tree {
}
A.compilation fails
B.an exception is thrown at runtime
C.an instance of Forest is serialized
D.an instance of Forest and an instance of Tree are both serialized
这个题目的答案是什么呢,大家先来考虑一下.
很多人都已经发现,在java中,它的流的层次是比较混乱的.为了SCJP,我们也只有理清它.
我们看一下,在jdk的源码中,ObjectOutputStream和FileOutputStream这两个类的定义.
现在,我先把这两个类的签名拿出来,大家先看一下.
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants{}
public class FileOutputStream extends OutputStream{}
主要是看extends后面的内容噢,ObjectOutputStream和FileOutputStream这两个类,都继承自OutputStream这样一个抽象类.按照我们一般的
习惯,如果把继承当做一棵树来看的话,那么ObjectOutputStream和FileOutputStream这两个类应该是兄弟关系.
再看例子中,ObjectOutputStream os=new FileOutputStream(fs);一个类的变量,是不能指向它的兄弟的对象的.
所以,这个程序根本不能通过编译.答案是A
那大家肯定要问一句,我应该怎么改呢?
我们只要把ObjectOutputStream os=new FileOutputStream(fs);改成ObjectOutputStream os=new ObjectOutputStream(fs);,把
FileOUtputStream的对象做为参数,去实例化一个ObjectOutputStream的对象就可以了.
等一下,这样还不算改好了,在JDK API文档中写的很明确噢,ObjectOutputStream只能将支持 java.io.Serializable 接口的对象写入流中。
那么我们定义的Tree这个类还没有实现java.io.Serializable接口呢,将Tree这个类改为:
class Tree implements Serializable{}
现在可以运行一下了,我们会找到一个Forest.Ser文件,打开后,你会发现里面是一段乱码,这是因为ObjectOutputStream自动将每个
serializable 对象的类编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。所以我
们看到的都是乱码也不奇怪了,只要是ObjectInputStream能够识别就行了.
我的QQ号:2535279
我的QQ群:58591592
www.javaedu.com.cn
import java.io.*;
public class Forest implements Serializable{
private Tree tree = new Tree();
public static void main(String[] args){
Forest f = new Forest();
try{
FileOutputStream fs = new FileOutputStream("Forest.Ser");
ObjectOutputStream os=new FileOutputStream(fs);
os.writeObject(f);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class Tree {
}
A.compilation fails
B.an exception is thrown at runtime
C.an instance of Forest is serialized
D.an instance of Forest and an instance of Tree are both serialized
这个题目的答案是什么呢,大家先来考虑一下.
很多人都已经发现,在java中,它的流的层次是比较混乱的.为了SCJP,我们也只有理清它.
我们看一下,在jdk的源码中,ObjectOutputStream和FileOutputStream这两个类的定义.
现在,我先把这两个类的签名拿出来,大家先看一下.
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants{}
public class FileOutputStream extends OutputStream{}
主要是看extends后面的内容噢,ObjectOutputStream和FileOutputStream这两个类,都继承自OutputStream这样一个抽象类.按照我们一般的
习惯,如果把继承当做一棵树来看的话,那么ObjectOutputStream和FileOutputStream这两个类应该是兄弟关系.
再看例子中,ObjectOutputStream os=new FileOutputStream(fs);一个类的变量,是不能指向它的兄弟的对象的.
所以,这个程序根本不能通过编译.答案是A
那大家肯定要问一句,我应该怎么改呢?
我们只要把ObjectOutputStream os=new FileOutputStream(fs);改成ObjectOutputStream os=new ObjectOutputStream(fs);,把
FileOUtputStream的对象做为参数,去实例化一个ObjectOutputStream的对象就可以了.
等一下,这样还不算改好了,在JDK API文档中写的很明确噢,ObjectOutputStream只能将支持 java.io.Serializable 接口的对象写入流中。
那么我们定义的Tree这个类还没有实现java.io.Serializable接口呢,将Tree这个类改为:
class Tree implements Serializable{}
现在可以运行一下了,我们会找到一个Forest.Ser文件,打开后,你会发现里面是一段乱码,这是因为ObjectOutputStream自动将每个
serializable 对象的类编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。所以我
们看到的都是乱码也不奇怪了,只要是ObjectInputStream能够识别就行了.