国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

十分鐘速懂java知識點 System類

2019-11-26 14:45:52
字體:
來源:轉載
供稿:網友

上次面試中遇到的一個問題,問到System.out.println()中的out是不是內部類,當時就給問蒙了,直觀感覺out應該是System類的一個屬性,跟內部類有什么關系?而且之前整理IO部分的時候記得有個PrintStream的類用于標準輸出的,但是從沒看過System的源碼,也不敢隨便再說了。后來看了下源碼,發現的確是PrintStream,可能當時想問的是內部類的用法吧,不過歸根結底自己水平差得多,還是要認真學習。
言歸正傳,System類是jdk提供的一個工具類,有final修飾,不可繼承,由名字可以看出來,其中的操作多數和系統相關。其功能主要如下:

  • 標準輸入輸出,如out、in、err
  • 外部定義的屬性和環境變量的訪問,如getenv()/setenv()和getProperties()/setProperties()
  • 加載文件和類庫的方法,如load()和loadLibrary()、
  • 一個快速拷貝數組的方法:arraycopy()
  • 一些jvm操作,如gc()、runFinalization()、exit(),該部分并未在源碼的java doc中提到,可能因為本身不建議主動調用吧。而且這幾個方法都僅僅是Runtime.getRuntime()的調用,兩者沒有區別

下邊直接看圖,主要的方法和功能都已經列出來。

下邊我們重點來該類是如何初始化的。
首先在開頭我們就可以看如下代碼:

private static native void registerNatives();static {  registerNatives();}

類中的靜態代碼塊調用了一個native方法registerNatives(),可以猜到該方法應該是一個入口方法,看一下注釋:通過靜態初始化注冊native方法,該方法會令vm通過調用initializeSystemClass方法來完成初始化工作。果然如此,那么接下來我們看下initializeSystemClass方法吧:

private static void initializeSystemClass() {  // 初始化props  props = new Properties();  initProperties(props);   sun.misc.VM.saveAndRemoveProperties(props);  //獲取系統相關的換行符  lineSeparator = props.getProperty("line.separator");  sun.misc.Version.init();  //分別創建in、out、err的實例對象,并通過setXX0()初始化,查看setXX0()方法可知,這是個native方法,將系統的標準流管理到類內的對象  FileInputStream fdIn = new FileInputStream(FileDescriptor.in);  FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);  FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);  setIn0(new BufferedInputStream(fdIn));  setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));  setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));  //加載zip包以獲取java.util.zip.ZipFile這個類,以便之后加載利庫使用  loadLibrary("zip");  // 設置平臺相關的信號處理  Terminator.setup();  // 初始化sun.misc相關的環境變量  sun.misc.VM.initializeOSEnvironment();  // 主線程不會在同一個線程組中添加相同的線程,我們必須在這里自己實現。注釋半天沒弄明白,看代碼就是主線程自己把自己加到了自己的線程組中......  Thread current = Thread.currentThread();  current.getThreadGroup().add(current);  // 注冊共享秘鑰?注釋沒看明白,該方法就是實例化一個JavaLangAccess  setJavaLangAccess();  // 子系統在初始化的時候可以調用sun.misc.VM.isBooted(),以保證在application類加載器啟動前不做任何事。booted()其實就是改了個狀態,使isBooted()變為true。  sun.misc.VM.booted();}

至此,System基本上便講完了,希望本文所述對大家學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 潜江市| 凭祥市| 常山县| 平陆县| 灵寿县| 孝昌县| 梨树县| 松原市| 舒城县| 汶上县| 镇平县| 时尚| 苗栗县| 宕昌县| 周至县| 杨浦区| 久治县| 长兴县| 加查县| 大埔县| 体育| 垫江县| 沙河市| 肇州县| 黑水县| 宣武区| 卓资县| 昌都县| 曲周县| 观塘区| 辽中县| 兴安县| 武功县| 安远县| 淄博市| 新疆| 姚安县| 盖州市| 隆安县| 柯坪县| 汪清县|