为什么Java System.in.read()可以调用非静态方法

为什么Java System.in.read()可以调用非静态方法,java,static-methods,instance-variables,system.in,Java,Static Methods,Instance Variables,System.in,在java中,java.lang.System类,它在静态变量中有一个。 声明为:中的公共静态最终输入流 这意味着,中的是一个InputStream变量。 然而,我看到一些例子,使用 System.in.read()读取输入 它如何做到这一点,InputStream中的read()方法不是静态方法,它如何直接调用它?据我所知,只有静态方法可以由类直接调用,而无需创建实例 read()声明:public abstract int read()抛出IOException 谢谢Jon Skeet的

在java中,
java.lang.System
类,它在静态变量中有一个
声明为:中的公共静态最终输入流
这意味着,
中的是一个InputStream变量。
然而,我看到一些例子,使用
System.in.read()
读取输入



它如何做到这一点,InputStream中的
read()
方法不是静态方法,它如何直接调用它?据我所知,只有静态方法可以由类直接调用,而无需创建实例


read()声明:
public abstract int read()抛出IOException



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

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

  • 调用
    java.lang.System.in
    (这是一个静态变量),in是一个
    java.io.InputStream
    变量
  • 调用类似于调用PrintStream类
  • 该过程的工作方式类似于调用:
    PrintStream.read()
  • 但是我很难理解read()方法,它不是一个静态方法,因为它不应该被直接调用
  • 应该这样称呼:

    PrintStream rd=新的PrintStream(); int c=rd.read()

  • as read()应该由实例调用。 read()声明:公共抽象int read()引发IOException

    PS:我尝试此代码不起作用:

    InputStream rd = new InputStream();
            int c = rd.read();
            System.out.println(c);
    
    但不知道为什么

    参考:

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

    您通过变量中的静态
    ,在
    InputStream
    的实例上调用它。因此:

    int c = System.in.read();
    
    相当于:

    InputStream stream = System.in;
    int c = stream.read();
    
    这有助于让事情更清楚吗

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

    您通过
    变量中的静态
    ,在
    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()方法,它不是一个静态方法,因为它不应该被直接调用。它应该像这样调用:PrintStream rd=new PrintStream();int c=rd.read();as read()应该由实例调用。read()declaration:public abstract int read()抛出IOException PS:I try此代码无效:InputStream rd=new InputStream();int c=rd.read();系统输出打印ln(c);但不知道为什么。我编辑了我的问题,因为在注释中我不知道如何格式化代码。谢谢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()方法,它不是一个静态方法,因为它不应该被直接调用。它应该像这样调用:PrintStream rd=new PrintStream();int c=rd.read();as read()应该由实例调用。read()declaration:public abstract int read()抛出IOException PS:I try此代码无效:InputStream rd=new InputStream();int c=rd.read();系统输出打印ln(c);但不知道为什么。我编辑了我的问题,因为在评论中我不知道如何格式化代码。