[英]System.out is declared as static final and initialized with null?
當我瀏覽System.class
,發現了一些對我來說似乎很奇怪的東西。 當您查看System.in, System.out, System.err
的聲明時System.in, System.out, System.err
它們會被標為final static
變量,但也會初始化為null
public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;
由於final
只能被初始化一次,那么如何對其進行管理?
當我們使用System.out.print("...");
顯而易見, out
不為null
但作為final static
,它是否不為null
?
那么任何人都可以解釋一下如何初始化已經聲明為final的嗎?
在靜態初始化程序中使用本機代碼對其進行初始化。 在System.java的頂部,您具有:
/* register the natives via the static initializer.
*
* VM will invoke the initializeSystemClass method to complete
* the initialization for this class separated from clinit.
* Note that to use properties set by the VM, see the constraints
* described in the initializeSystemClass method.
*/
private static native void registerNatives();
static {
registerNatives();
}
registerNatives()
方法將在in / out / err中初始化-並且它是在本機代碼中進行的-本機代碼幾乎可以做任何想要的事情,並且不僅限於所有Java語言規則。 (盡管您也可以通過反射在Java中設置一個已經初始化的final字段)
由於final只能被初始化一次,那么如何對其進行管理?
雖然可以通過反射更改static final
變量,但在這種情況下,可以通過本機方法更改字段。
從java.lang.System
public static void setIn(InputStream in) {
checkIO();
setIn0(in);
}
// same for setOut(), setErr()
private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);
當我們使用System.out.print(“ ...”); 顯而易見,out不為空,但作為最終靜態對象,它是否不為空?
在您有機會使用它之前將其設置好。
您可能想知道為什么這樣做? 答案幾乎可以肯定與訂單類的加載有關。 許多類都是按順序啟動的,但需要按有效的順序進行初始化。
那么任何人都可以解釋一下如何初始化已經聲明為final的嗎?
這是因為final
並不像您想象的那樣最終。 有人建議我們需要一個final final
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.