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

时间:2013-08-18 06:59:59

标签: java static-methods instance-variables system.in

在java中,java.lang.System类,其中包含 静态变量。
声明为:公共静态最终InputStream
这意味着 in 是一个InputStream varibale。
但是我看到一些例子,使用 System.in.read()阅读输入。



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


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


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

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

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

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

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

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

    InputStream rd = new InputStream();
            int c = rd.read();
            System.out.println(c);
    

    但不知道为什么。

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

1 个答案:

答案 0 :(得分:7)

  

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

您通过静态InputStream变量在 in的实例上调用它。所以这个:

int c = System.in.read();

相当于:

InputStream stream = System.in;
int c = stream.read();

这有助于使其更清晰吗?