supermab2 2022-03-06 13:41 采纳率: 33.3%
浏览 19
已结题

关于system.in的理解

System类中有in这个成员变量,查源码它的定义是public static final InputStream in
对于这个定义不太理解,书上说可以通过System.in.read()来调用InputStream的read方法,InputStream不是一个抽象类吗,只能通过通过它的子类new一个对象出来然后再调用它的方法,为什么可以用System类的一个成员变量in作为InputStream类的一个对象,来调用一个抽象类的抽象方法呢 ?所以
system.in返回的到底是什么?
总的来说,不理解下面两行代码(两行代码不存在相互关系):
system.in.read() system.in返回啥,怎么还能调用方法?
InputStreamReader isr = new InputStreamReader(System.in);什么意思这?

看网上说这是多态:
InputStream is = System.in;
编译看左边,运行看右边。InputStream中含有read()方法,所以编译不会报错。而运行时候,是运行的右边,即InputStream的子类。
还有一个简单的方法,直接System.out.println(System.in); 打印出来的,是一个java.io.BufferedInputStream@68d448a1;
即,System.in 表示的是一个BufferedInputStream对象。
可我也没发现InputStream和System.in存在字父类的关系

求各位解惑

  • 写回答

1条回答 默认 最新

  • 大鹏cool Java领域优质创作者 2022-03-06 15:08
    关注
    • system.in.read() system.in返回啥,怎么还能调用方法?

    虽然 System.in 的类型为 InputStream,但是实际上 System.in 指向了一个 InputStream 实现类,这个具体的类型是 JVM 设置的,调用方法时 JVM 会根据 System.in 这个引用找到真正的对象调用其方法。

    • InputStreamReader isr = new InputStreamReader(System.in);

    这段代码只是把 InputStream 类型作为 InputStreamReader 构造方法参数,创建一个 InputStreamReader 实例,InputStream 是面向字节的,读取的是字节,InputStreamReader 面向字符,可以把 InputStream 读取的字节转换为字符串。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月6日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效