2013-10-04 34 views
6

出於好奇,我一直在尋找在docjar.com找到的一些Java API類的源代碼。我看到了java.lang.System中的類,只見那PrintStream的 「出」(即下,System.out)有下列代碼:爲什麼PrintStream「out」和InputStream「in」null?

public final static PrintStream out = null; 

和評論,它說:

The "standard" output stream. This stream is already 
open and ready to accept output data. 

我的問題是,我知道最終變量不能被修改,所以爲什麼它宣佈時爲空?爲什麼在調用「out」方法時Java不拋出NullPointerException? System.in也是如此。

感謝您的任何澄清。

回答

1

有一個java.lang.System#registerNatives()本地方法。如果您在jvm源代碼中查看它,它會從本機代碼分配sysin,sysout和syserr。在java 7之前,這些聲明看起來像public final static InputStream in = nullInputStream();,但我想他們將它改爲null,並且javac中的一些黑客不會僅僅內聯它。

0
  • 看看私有靜態無效initializeSystemClass() - 此 方法被調用來啓動的事情了,它調用setOut0(),這是一個 本地方法。這將流聯繫到它應該是的地方。

    所以,即使該字段可能看起來像公共靜態最終它實際上 不是,本機代碼改變它。

    JVM調用private static void initializeSystemClass()方法初始化它。