关于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存在字父类的关系

求各位解惑

  • 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 读取的字节转换为字符串。