在System.out.println()中输出

srk*_*srk 18 java jvm system

首先感到遗憾的是,这是一个非常基本的问题,我宣传我仍然是一个代码猴.我在接受采访时被要求阐明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..
}
Run Code Online (Sandbox Code Playgroud)

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

System.out.pritnln(); 
Run Code Online (Sandbox Code Playgroud)

他让我模拟一个类似的程序,我跟踪它并没有用,因为System.out返回null

我的问题是在java中实例化的对象在哪里?如果我没错,它是一个预定义的对象吗?应该是什么细致的解释.

从技术上讲,我们应该叫什么?是PrintStream类型的变量还是应该将其称为PrintStream类型的对象?

Jiv*_*ngs 21

System.out初始化null为实例化类时.这是由nullPrintStream()方法设置的System.java,它只返回null.

当JVM初始化时,它会调用该initializeSystemClass()方法.此方法调用native方法setOut0()这设定out变量为适当的值.

这可能看起来很奇怪,但由于以下原因,这是必要的操作:

  • out不能静态设置为值,因为System需要是第一个加载的类之一(之前PrintStream).
  • out必须final使其值不能被用户直接覆盖.
  • 由于out不能静态设置,并且是最终的,我们必须使用native方法覆盖语言的语义setOut0().

我希望这有助于你理解.


Ósc*_*pez 6

System.out是一个普通的静态属性,它是由JVM initializeSystemClass()在JVM初始化期间通过该方法设置的.你甚至可以改变通过简单地调用它(尽管它不推荐)System.setOut(printOutStream);,在那里printOutStream是流你想要的标准输出使用.

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