[英]out in System.out.println()
首先感到遺憾的是,如果這是一個非常基本的問題,我建議我仍然是代碼猴子。 我在一次采訪中被要求闡明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中實例化的對象在哪里? 如果我沒看錯,它是預定義的對象嗎? 為此應該進行細致的解釋。
從技術上講,我們應該喊什么? 是類型為PrintStream的變量還是應該說它為類型為PrintStream的對象?
實例化類時,System.out初始化為null
。 這是由設置nullPrintStream()
在方法System.java
,這只是返回null
。
JVM初始化后,將調用initializeSystemClass()
方法。 此方法調用本native
方法setOut0()
,該方法將out
變量設置為適當的值。
這看起來很奇怪,但是由於以下原因,它是必需的操作:
out
不能靜態設置為該值,因為System
需要是第一個加載的類之一(在PrintStream
之前)。 out
必須是final
以便用戶不能直接覆蓋其值。 out
不能靜態設置,並且是最終的,因此我們必須使用native
方法setOut0()
覆蓋語言的語義。 希望對您有所幫助。
System.out
是正常的靜態屬性,它是JVM在JVM初始化期間通過initializeSystemClass()
方法設置的。 您甚至可以通過簡單地調用System.setOut(printOutStream);
來更改它(盡管不建議這樣做System.setOut(printOutStream);
,其中printOutStream
是要用作標准輸出的流。
這是一篇很好的文章,詳細介紹了System.out.println()的工作方式。
System.out.pritln中的Out是System類中PrintWriter的靜態字段(對象),而println是PrintWriter的方法。
參考:系統: http : //docs.oracle.com/javase/6/docs/api/java/lang/System.html PrintWriter: http : //docs.oracle.com/javase/6/docs/api/java /io/PrintWriter.html
甚至不需要網絡和文檔。 我們可以簡單地說javap java.lang.System,它為您提供了所有靜態字段的列表,這些列表屬於System類。 我們可以使用javap獲取任何java類的詳細信息,只要您知道它的包和類名是System類中定義的PrintStream的公共靜態對象即可。
初始化System類時,它將調用其initializeSystemClass()
方法,下面是代碼:
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
在此代碼中, setOut0()
是在System.c中實現的本機函數:
JNIEXPORT void JNICALL
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
{
jfieldID fid =
(*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
if (fid == 0)
return;
(*env)->SetStaticObjectField(env,cla,fid,stream);
}
這是一個標准的JNI代碼,將System.out設置為傳遞給它的參數,該方法調用本地方法setOut0(),該方法將out變量設置為適當的值。
System.out
是最終的,這意味着無法在initializeSystemClass()中將其設置為其他值,但是使用本機代碼可以修改最終變量。
System.out由JVM提供。 在您的主要方法被調用時,System.out已打開並可以使用。
參見http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#out
在Oracle Java運行時庫中,它是使用registerNatives()
本機方法本地化的,該方法在加載System
類時被調用(通過static
初始化程序)。 但是,這是一個實現細節。
您也可以直接使用System.setOut()
設置System.out
。
的System.out.println();
這里的println是printstream類的對象。我們不能直接為printstream類創建對象。 Out是系統類的對象。 out在系統類中稱為字段。 在調用system.out時,它間接為printstream類創建對象。 因此我們可以使用System.out.prontln()調用println()方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.