为啥 Java System.in.read() 可以调用不是静态方法

Posted

技术标签:

【中文标题】为啥 Java System.in.read() 可以调用不是静态方法【英文标题】:Why Java System.in.read() can call which is not a static method为什么 Java System.in.read() 可以调用不是静态方法 【发布时间】:2013-08-20 05:33:23 【问题描述】:

在 java 中,java.lang.System 类,它有一个 in 静态变量。 声明为:public static final InputStream in 这意味着 in 是一个 InputStream 变量。 但是我看到一些例子,使用 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()
    调用java.lang.System.in(这是一个静态变量),是一个java.io.InputStream变量 调用行为类似于调用 PrintStream 类。 该过程像调用一样工作:PrintStream.read() 但是我很难理解 read() 方法,它不是静态方法,因为它不应该直接调用。

    应该这样称呼:

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

as read() 应该由实例调用。 read() 声明:public abstract int read() throws 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】:

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

您通过静态in 变量将其称为on InputStream 的一个实例。所以这个:

int c = System.in.read();

相当于:

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

这是否有助于使其更清晰?

【讨论】:

谢谢 Jon Skeet 的回答,我还有点不明白。 @loadload:好吧,不具体说明那一点是什么,我认为我(或其他任何人)无法帮助您。 如果我调用 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.但是我理解read()方法有困难,它不是一个静态方法,因为它不应该被直接调用。 5.它应该像这样调用: PrintStream rd = new PrintStream(); int c = rd.read();因为 read() 应该由实例调用。 read() 声明:public abstract int read() throws IOException PS:我尝试这段代码不起作用:InputStream rd = new InputStream(); int c = rd.read(); System.out.println(c);但不知道为什么。 我编辑了我的问题,因为在评论中我不知道如何格式化代码。

以上是关于为啥 Java System.in.read() 可以调用不是静态方法的主要内容,如果未能解决你的问题,请参考以下文章

java中从控制台让用户输入参数的语句是啥?

Java中从控制台输入数据的几种常用方法

System.in.read()

Java从控制台获取数据的方法

Java中的输入方式

Java比较两个数字的大小 两个参数由键盘输入