out in System.out.println()

2022-09-02 13:24:15

首先,如果这是一个非常基本的问题,我会后悔,我提倡我仍然是一只代码猴子。在一次采访中,我被要求阐明System.out.println();我用以下方式解释

//this class belongs to java.lang package
class System{
  public static PrintStream out;
}
//this class belongs to java.io package
class PrintStream{
 public void println..
}

我已经解释了System.out是有效的,因为这是我们在java中访问静态变量的方式,而out是PrintStream的一个对象,因此我们可以访问它的方法,总而言之

System.out.pritnln(); 

他要求我模拟一个类似的程序,我跟踪了它,它不起作用,因为System.out返回null

我的问题是在java中哪里实例化了out对象?如果我没有错的话,它是一个预定义的对象吗?对此应该一丝不苟的解释。

从技术上讲,我们应该喊出什么?是 PrintStream 类型的变量,还是应该说它是 PrintStream 类型的对象?


答案 1

System.out 初始化为实例化类时。这是由 中的方法设置的,该方法仅返回 。nullnullPrintStream()System.javanull

当 JVM 初始化后,它将调用该方法。此方法调用将变量设置为适当值的方法。initializeSystemClass()nativesetOut0()out

这可能看起来很奇怪,但这是一个必要的操作,原因如下:

  • out不能静态设置为该值,因为需要是第一个装入的类之一(之前)。SystemPrintStream
  • out必须使其值不能被用户直接覆盖。final
  • 由于不能静态设置,并且是最终的,因此我们必须使用方法覆盖语言的语义。outnativesetOut0()

我希望这有助于您的理解。


答案 2

System.out是一个普通的静态属性,它是在JVM初始化期间由JVM通过方法设置的。您甚至可以通过简单地调用 来更改它(尽管不建议这样做),其中是要用作标准输出的流。initializeSystemClass()System.setOut(printOutStream);printOutStream

这是一篇很好的文章,详细介绍了System.out.println()是如何工作的。


推荐