免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1696 | 回复: 1
打印 上一主题 下一主题

SCJP考试试题解析一 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-26 22:32 |只看该作者 |倒序浏览
SCJP考试试题解析一

我的QQ号:2535279


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这两个类的定义.

现在,我先把这两个类的签名拿出来,大家先看一下.

//www.javaedu.com.cn
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能够识别就行了.

论坛徽章:
0
2 [报告]
发表于 2008-06-27 00:10 |只看该作者
IO, Swing 不是从scjp中除去了,这属于SCJD的内容了。
你这说是那个版本的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP