日期:2014-05-20  浏览次数:20703 次

太神奇了,对System.in.read()的疑问,请高手指点
1.这个in为什么可以被定义为抽像类inputstream定义,抽像类不是一定要被继承的子类才能用么;
2.既然in被定义成抽像类,那为什么还能继续调用.read()方法,我查了源文件根本就没有静态的read()方法,起码他得先建立个对像才能调用read吧
3.in在System中定义,一般情况下是返回null的,null的话不就等于空么,还怎么可以调用方法
4.谢谢邦助我的人,好人一生平安!

------解决方案--------------------
1:
"被定义为抽像类inputstream"你应该理解成 "in是一个InputStream",至于它到底是什么样的InputStream你不需要关心
这就是所谓抽象

2:
System.in是在System类中定义的一个静态field,对in调用read()并非静态调用(System.in是一个实例,而非一个类名)
其他疑问参考答案1

3:
对于输入流的定义各个平台实现的方式肯定是不一致的
System类还需要初始化
这个是System类中的
Java code

/**
     * Initialize the system class.  Called after thread initialization.
     */
    private static void initializeSystemClass() {

------解决方案--------------------
第一、二个问题建议反复理解java的多态机制。

第三个问题的神奇之处在这里:
Java code
    /* First thing---register the natives */
    private static native void registerNatives();
    static {
        registerNatives();
    }