【问题标题】:Java input and output streams [duplicate]Java输入和输出流[重复]
【发布时间】:2020-07-01 01:24:25
【问题描述】:

java 程序中的 System.in 和 System.out 是什么?我知道如何使用它们,但方式是'。使用运算符似乎对象输入/输出本质上是静态的,即使我没有得到它。

【问题讨论】:

  • 是的,它们是静态的,它们用于从控制台读取输入或将某些内容输出到控制台。通常非常适合调试。
  • 很棒,因为它包含 OOTB,但不是最好的,我建议您使用 logger 进行调试

标签: java


【解决方案1】:

System.out.println 的结构:

public final class System {
    static PrintStream out;
    static PrintStream err;
    static InputStream in;
    ...
}

public class PrintStream extends FilterOutputStream {
    //out object is inherited from FilterOutputStream class
    public void println() {
    ...
}

下面给出System.out.println();的解释:

  1. Systemjava.lang package 中的最后一个类。
  2. out是System类的静态成员字段,属于PrintStream类型。
  3. printlnPrintStream 类的方法。

注意: System.out.println(); 用于在控制台打印。同样System.in 是一个标准的InputStream,它连接到控制台程序的键盘输入。

【讨论】:

    【解决方案2】:

    它们实际上是历史的侥幸。整个 java 语言中没有其他东西能像它们一样。对于学习java,最好只是接受它们是这样的,并且不像其他任何东西,这并不重要。

    当心 - 如果你必须知道

    outerrin 都是 public static 类中的 public static 字段。它们被标记为final,因此System.out = null; 是不合法的,但它们实际上并不是最终的(因为它们可以更改)。对更改它们的支持是由System.setOut 应用的 hack。此方法调用本机代码(这是在 C/汇编程序中实现的 java 方法,即直接针对您的 VM 运行的平台的实现,每个架构 java 都有自己的这些实现)。

    总之,这是一种荒谬的做法,但它就是这样做的。

    那为什么是合法的 java 呢?

    语法本身并没有什么特别之处,虽然不建议这样做,因此您很少看到它。想象一下你有这个:

    public class Example {
        public static final List<String> foo = new ArrayList<String>();
    }
    
    class MyCode {
        void whatever() {
           Example.foo.add("Hello!");
        }
    }
    

    这编译并运行良好; Example 引用 Example 类,Example.foo 引用其中名为 foo 的公共字段,Example.foo.add 取消引用该字段以查找该字段指向的数组列表,并调用该列表的 add方法。

    这样做的问题是公共字段是 'icky' - 它们不是惯用的(大多数 java 代码不能以这种方式工作;因此,使公共字段使您的代码看起来很奇怪),字段不参与继承(您不能通过接口声明任何实现它的类都会公开一些字段。字段不能被覆盖),并且您不能模拟它们或以其他方式虚拟化或抽象它们的性质。

    那么为什么 System.out 会这样呢?

    历史。如果 java 已经“修复”了这个错误,那么任何从 sysin 读取或写入 sysout 或 syserr 的代码都将不再在任何“修复”这个错误的 java 版本中编译。有些语言会这样做。 Java 在制度上对此非常犹豫(“破坏向后兼容性”)。这样做会导致项目坚持旧版本并破坏社区。想象一下,您编写了一个流行的 java 库。你必须为 18 个不同的 java 版本发布它,这会很混乱。

    【讨论】:

      【解决方案3】:

      很高兴你正在学习 JAVA。

      我希望这些链接可以帮助您更多地了解您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-19
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        • 2012-07-19
        • 2012-11-17
        • 2017-06-09
        相关资源
        最近更新 更多