黑马程序员技术交流社区

标题: InputStream中的read方法是抽象的,求解答为什么可以直接调用 [打印本页]

作者: silencer    时间: 2015-4-6 21:58
标题: InputStream中的read方法是抽象的,求解答为什么可以直接调用
本帖最后由 silencer 于 2015-4-9 13:59 编辑

import java.io.*;
class  ReadIn
{
        public static void main(String[] args) throws IOException
        {
                InputStream in = System.in;
                StringBuilder sb = new StringBuilder();

                while(true)
                {

                        int ch = in.read();
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                        {
                                String s = sb.toString();
                                if("over".equals(s))
                                        break;
                                System.out.println(s.toUpperCase());
                                sb.delete(0,sb.length());
                        }
                        else
                                sb.append((char)ch);

                }
        }
}
作者: 君嘘    时间: 2015-4-6 23:55
本帖最后由 君嘘 于 2015-4-6 23:57 编辑

InputStream in = System.in;
这代码你懂什么意思嘛。。为何你会理解成in.read()是调用InputStream中的那个read()方法。

这句代码可以看出in是InputStream类型的变量吧。

这时候调用read是这样的:System.In.read()
而System.in中是怎么调用read()的我不清楚,想了解的话你要去查源码了。

不过可以肯定的是,in.read()调用的不是InputStream中的那个read(),而是某个继承了InputStream的子类中的的read()。

作者: 奋斗的黑马    时间: 2015-4-7 10:32
君嘘 发表于 2015-4-6 23:55
InputStream in = System.in;
这代码你懂什么意思嘛。。为何你会理解成in.read()是调用InputStream中的那个 ...

System.in-------------应该肯定是一个对象(而且这个对象肯定是实现了InputStream抽象类的子类对象,这个子类的对象实现了抽象类中的抽象方法read(),所以才能调用,这里涉及多态)


不过,在查看System这个类的API中,看到是这样的
public final class System ------System 类包含一些有用的类字段和方法。它不能被实例化
      ---该final类中有三个成员变量,
                      ---public static final InputStream in
                      ---public static final PrintStream out
                      ----public static final PrintStream err
       这三个成员变量都是静态的,类名直接调用
       不过,用类名直接调用这三个静态变量,怎么会是一个对象呢??
求解释?
作者: 奋斗的黑马    时间: 2015-4-7 10:49
看的有些书上说,System.in是一个BufferedInputStream类的对象,,
作者: 陈佳    时间: 2015-4-7 11:49
这里涉及到了多态的知识,InputStream in = System.in;System.in是标准输入流,对应的是键盘,是InputStream的子类,这里是父类的引用指向了子类的对象。in.read()中的in指向的是System.in所以是可以调用该方法的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2