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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© YLsjg 初级黑马   /  2013-12-8 17:51  /  1177 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 YLsjg 于 2013-12-9 09:14 编辑

为什么System.in可以为InputStream实例化对象,System.out可以为OutputStream实例化对象,这个问题有点搞不明白,查了API文档,还是不明白System类和InputStream、OutputStream的关系!明白人给讲一下呗!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
这里面只讲一下OutputStream以及System.out。in的一样的道理。
OutputStream是一个抽象类,而System.out是一个PrintStream的对象。
out为System的一个final属性,在jvm启动的时候会自动执行,创建一个PrintStream对象并赋值给System的out属性。由于PrintStream是OutputStream的子类,因此out也就为OutputStream的实例化对象。这个是面向对象的一个特点。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
System.in 和 System.out底层操作是采用字节流进行操作的,所以返回的数据的字节数据。
System 类包含一些有用的类字段和方法(API描述)。提供了标准的输入输出等操作。
而InputStream、OutputStream定义字节操作的抽象类,其实现的子类可以对字节流进行操作。
即,InputStream、OutputStream可以对System.in 和 System.out 中的相关数据操作。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您好,查看jdk文档的System类可知,System类是有一个InputStream 类型的静态字段in,System.in为InputStream实例化对象,其实是System类的静态字段out在初始化时已经创建了一个InputStream(或者其实现类等)型的对象并将该对象的地址值赋给了字段out(该字段在堆中)。注意,字段out存储的就是堆中一个对象的地址值,那么当然它就可以被赋给一个InputStream型引用(该引用的内存空间在栈中),即为InputStream实例化。
OutputStream实例化类似。希望您能理解,如果有说的不对的额,欢迎指出,谢谢!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你好!我稍稍看了下各楼层给出的答案!~其实我觉得答案可以简化很多!毕竟你看到IO流了~估计毕老师的一些细节你也还记得!~
我给出的回答:
【只拿System.in 说!可以举一反三】
1、System.in   对应的是键盘的(字节)输入~用得是字节~
2、InputStream实例化对象就是操作字节流  

希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
例如:OutputStream to= System.out ;
声明了一个输出流文件,指向标准输出,然后如果对to写入数据流的话,就会输出到屏幕上。
outputStream就像管道一样(体会stream的流动的感觉,流文件),管道的出口就是系统的标准输出out;当然这个出口也可以是数组,可以是文件,当你想在终端(显示器)上显示的时候就用system.out.

实际上System中的标准输入串流 in 物件就是一个 InputStream,在程式开始之后,这个串流物件就会开启,以从标准输入装置中读取资料,out可以理解为一个OutputStream。
明白了?

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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