A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

InputStream不是个抽象类吗,为什么它可以直接调用read方法,如果是多态,它又是那个实现类呢?
InputStream instream = System.in;
int len = instream.read()   
//不能理解这里怎么可以直接调用呢?System类源码中对in的定义: public final static InputStream in = null;

13 个回复

倒序浏览
对啊 看到In前面inputstream  吗    system.in 只是一个字段   你调用这个字段后返回是一个inputstream 流不过这个流打开的通道连接的是键盘
回复 使用道具 举报
只要前面有类型的带的肯定有返回值  它前面带inputstream返回的肯定是一个inputstream对象实例
回复 使用道具 举报
可以问问老师啊
回复 使用道具 举报
boboyuwu 发表于 2015-12-19 23:25
只要前面有类型的带的肯定有返回值  它前面带inputstream返回的肯定是一个inputstream对象实例
...

可是InputStream不是一个抽象类吗?抽象类可以直接调方法吗
回复 使用道具 举报
yyt199108 发表于 2015-12-20 01:19
可是InputStream不是一个抽象类吗?抽象类可以直接调方法吗

大哥你没仔细看api吗,抽象类中可以有抽象方法也可以没有抽象方法,你看下inputstream中的方法read()不是抽象方法啊,这个要仔细观察
回复 使用道具 举报
boboyuwu 发表于 2015-12-20 11:53
大哥你没仔细看api吗,抽象类中可以有抽象方法也可以没有抽象方法,你看下inputstream中的方法read()不 ...

我说错了了  你确定可以调用read()  read()是抽象方法啊
回复 使用道具 举报
....................InputStream 是IO的吧-  - 他的方法里有read读的, 建议你看下IO那里
回复 使用道具 举报
icm 来自手机 中级黑马 2015-12-20 23:29:13
9#
现在还是不能理解
回复 使用道具 举报
Hi.。 中级黑马 2015-12-21 02:53:05
10#
icm 发表于 2015-12-20 23:29
现在还是不能理解

这个简单。这里是多态啊。
InputStream is = System.in;
编译看左边,运行看右边。InputStream中含有read()方法,所以编译不会报错。而运行时候,是运行的右边,即InputStream的子类。
还有一个简单的方法,直接System.out.println(System.in); 打印出来的,是一个java.io.BufferedInputStream@68d448a1;
即,System.in 表示的是一个BufferedInputStream对象。这样就好理解了

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报 2 0
boboyuwu 发表于 2015-12-20 19:19
我说错了了  你确定可以调用read()  read()是抽象方法啊

可以调read()。现在懂了,System.in返回的是BufferedInputStream,所以可以直接调用read方法
回复 使用道具 举报
Hi.。 发表于 2015-12-21 02:53
这个简单。这里是多态啊。
InputStream is = System.in;
编译看左边,运行看右边。InputStream中含有read ...

谢谢,明白了
回复 使用道具 举报
yyt199108 发表于 2015-12-21 16:44
可以调read()。现在懂了,System.in返回的是BufferedInputStream,所以可以直接调用read方法 ...

恩 这样就行
回复 使用道具 举报
本帖最后由 聚散不由我丶 于 2017-4-13 15:49 编辑
bufferedinputstream
bufferedinputstream
bufferedinputstream
bufferedinputstream




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马