非常鐘速懂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根本上便講完了,願望本文所述對年夜家進修有所贊助。