2014-11-21 93 views
0

我明白系統是一類,系統類型爲PrintStream的領域(的實例的PrintStream類)和println( )是從PrintStream的方法。但我不明白如何的PrintStream得到由instaniated出的PrintStream類是在java.io包,java.io和不會自動在Java的進口?我錯過了什麼嗎?的Java的System.out.println()

+0

的'import'聲明只是讓您能夠使用類型的簡單名稱(或它的成員),而不是完全限定的類型名稱。 – 2014-11-21 19:48:58

+1

如果你看一下'System'的實現,你會發現很多'import'語句,但是這些與你如何實例化一個類型或初始化一個實例無關。 – 2014-11-21 19:49:52

回答

4

因爲System.out是全局的,所以它由Java運行時實例化和初始化。從Javadoc(強調增加),

「標準」輸出流。 該流已經打開並準備好接受輸出數據。

+0

因此它在JVM的初始化過程中「有本地進口」neccessery java.io類? – CuriousGuy 2014-11-21 19:50:46

+1

@CuriousGuy Java在內部不使用'imports'。這對開發人員來說很方便。相反,Java總是使用完全限定的類名。你可以用'javap -v'檢查你的類的字節碼,我想你確實在問[Java Classloader](https://en.wikipedia.org/wiki/Java_Classloader)。 – 2014-11-21 19:51:58

2

它不是實際實例化了。如果你看一下源代碼,你會看到這一行:

public final static PrintStream out = null; 

和javadoc中說,它「已經打開並準備接受輸出數據。」

在這裏,您有一個鏈接:https://docs.oracle.com/javase/7/docs/api/java/lang/System.html

+0

順便說一句,'System.err'也是如此:-) – 2014-11-21 19:50:24

+0

是的,但類型「PrintStream」是一個類。所以它應該已經可以使用,如果它創建了PrintSteream類型的變量? – CuriousGuy 2014-11-21 19:52:32

+0

我的意思是「沒有實例化」是* out *是一個靜態成員,這意味着你不需要以'System s = new System()'的形式創建'System'的實例。 s.out()'。 「PrintStream」類當然可以使用......雖然我不確定「可用」是指技術上的意思。 – 2014-11-21 19:56:43

相關問題