为什么Java System.in.read()可以调用哪个不是静态方法

1 java static-methods instance-variables system.in

在java,java.lang.Systemclass中,它有一个in静态变量.
声明为:public static final InputStream in this
表示in是一个InputStream varibale.
但是我看到一些例子, System.in.read()用于读取输入.



怎么能这样做,read()InputStream中的方法不是静态方法,怎么能直接调用呢?据我了解,只有静态方法可以直接由类调用而无需创建实例.


read()声明: public abstract int read() throws IOException


谢谢Jon Skeet的回答,我还有一点不明白.

如果我调用System.in.read()哪个意味着我调用InputStream类方法read()

java.lang.System.in -----> java.io.InputStream ----> read()
Run Code Online (Sandbox Code Playgroud)
  1. 调用java.lang.System.in(这是一个静态变量),in是一个java.io.InputStream变量
  2. 调用行为就像调用PrintStream类一样.
  3. 这个过程就像调用: PrintStream.read()
  4. 但是我很难理解read()方法,它不是一个静态方法,因为它不应该直接调用.
  5. 它应该像这样调用:

    PrintStream rd = new PrintStream(); int c = rd.read();

因为read()应该由实例调用.read()声明:public abstract int read()抛出IOException

PS:我试试这段代码不起作用:

InputStream rd = new InputStream();
        int c = rd.read();
        System.out.println(c);
Run Code Online (Sandbox Code Playgroud)

但不知道为什么.

参考:http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

Jon*_*eet 7

怎么能这样做,InputStream中的read()方法不是静态方法,它怎么能直接调用呢?

您通过静态变量一个实例调用它.所以这:InputStreamin

int c = System.in.read();
Run Code Online (Sandbox Code Playgroud)

相当于:

InputStream stream = System.in;
int c = stream.read();
Run Code Online (Sandbox Code Playgroud)

这有助于使其更清晰吗?