非常鐘速懂java常識點 System類。本站提示廣大學習愛好者:(非常鐘速懂java常識點 System類)文章只能為提供參考,不一定能成為您想要的結果。以下是非常鐘速懂java常識點 System類正文
前次面試中碰到的一個成績,問到System.out.println()中的out是否是外部類,其時就給問蒙了,直不雅感到out應當是System類的一個屬性,跟外部類有甚麼關系?並且之前整頓IO部門的時刻記得有個PrintStream的類用於尺度輸入的,然則從沒看過System的源碼,也不敢隨意再說了。後來看了下源碼,發明切實其實是PrintStream,能夠其時想問的是外部類的用法吧,不外歸根結柢本身程度差很多,照樣要賣力進修。
言歸正傳,System類是jdk供給的一個對象類,有final潤飾,弗成繼續,由名字可以看出來,個中的操作多半和體系相干。其功效重要以下:
下邊直接看圖,重要的辦法和功效都曾經列出來。
下邊我們重點來該類是若何初始化的。
起首在開首我們便可以看以下代碼:
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根本上便講完了,願望本文所述對年夜家進修有所贊助。