簡體   English   中英

在System.out.println()中

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

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