簡體   English   中英

System.out聲明為static final並使用null初始化嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM