程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 非常鐘速懂java常識點 System類

非常鐘速懂java常識點 System類

編輯:關於JAVA

非常鐘速懂java常識點 System類。本站提示廣大學習愛好者:(非常鐘速懂java常識點 System類)文章只能為提供參考,不一定能成為您想要的結果。以下是非常鐘速懂java常識點 System類正文


前次面試中碰到的一個成績,問到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根本上便講完了,願望本文所述對年夜家進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved