1. 程式人生 > >java System類解析

java System類解析

System類是一個由final修飾的類,所以無法被繼承,只有一個私有的構造器,所以也無法例項化。

System類所有的屬性和方法都是公有 static修飾的,可以由類名直接呼叫

屬性: 
       
InputStream in;  輸入流

PrintStream out; 列印輸出流

PrintStream err; 標準錯誤列印輸出流,該留已經開啟,隨時準備接受輸出資料

SecurityManager  security;  java安全管理器

Console  cons;  控制檯,用於從控制檯或裝置讀取字串,一般是使用者名稱密碼,尤其是密碼是不可見的

Properties  props ; 系統屬性資料,java預設55條屬性,其中包括專案使用者執行環境檔案路徑以及換行符等

方法:
 1、native void registerNatives();  
 該方法在類載入時執行。

  System類存在靜態塊

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

  根據註釋,該方法被執行,jvm會自動呼叫 initializeSystemClass()方法。而initializeSystemClass方法會將以上輸入流,列印輸出流,以及安全管理器等屬性賦值。在實際應用中我們用到的System.out.println(),就是呼叫System類中的out列印輸出流的println()方法,列印各種資料。

2、setIn(InputStream in)

      對類靜態變數屬性 in 賦值。在System類載入時,會自動呼叫該方法,建立預設的輸入流,內部呼叫checkIO()方法,標識java安全管理器會校驗操作許可權

3、setOut(PrintStream out);

      對類靜態屬性out賦值,和setIn(InputStream in);方法類似,都會執行相同的操作

4、setErr(PrintStream err);

      賦值靜態變數屬性err。  和上面setOut(PrintStream out);類似

5、console();  

      用於構建預設的控制檯物件,賦值給變數cons,一般idea是獲取不到console的,因為沒有控制檯,需要在cmd控制檯執行程式

6、Channel  inheritedChannel() throws IOException;

       返回建立類實體的通道 ---java虛擬機器

7、checkIO();

       java安全管理器校驗流操作

8、native void setIn0(InputStream in);

       由jvm對輸入流進行賦值

9、native void setOut0(PrintStream in);

       和setIn0()類似

10、native  void setErr0(PrintStream in);

       和setErr0()類似

11、setSecurityManager(final SecurityManager s);

        自定義java安全管理器

12、setSecurityManager0(final SecurityManager s);

        自定義java安全管理器,同步方法,

13、getSecurityManager();

        獲取java安全管理器

14、native  long  currentTimeMillis();

        獲取系統當前時間,毫秒,注意:不同的作業系統對毫秒的測量單位不一樣

15、native  long  nanoTime(); 

        獲取當前系統時間  納秒為單位   注意:1納秒 = 1毫秒 *1000 * 1000

16、native  void arraycopy(object src , int srcPos , object  dest , int  destPos , int length);

        複製陣列

        引數: src:被複制的陣列; srcPos:指定複製索引,從哪個索引開始複製。desc:複製的陣列。destPos:從複製陣列中哪個索引開始拷貝。length:複製幾個元素

 比如:

        String[] arr = new String[]{"1","2","3","4"};
        String[] arr1= new String[]{"5","6","7","8"};
        System.arraycopy(arr,1,arr1,0,2);

    含義:從陣列arr的索引1開始(第二個元素開始)複製,複製2個元素,拷貝到陣列arr1,從索引0開始拷貝(第一個元素開始拷貝)。執行完成後,會發現arr1陣列的值變成  2   3   7    8

     

      注意:如果如果length長度引數數值大於可複製陣列長度,或者為負數,則會丟擲ArrayIndexoutofBoundException異常

17、native  int  identityHashCode(Object x);

        返回物件的hashCode值。注意:不管該物件有沒有重寫hashCode()方法,返回的hashCode值都是根據物件實體記憶體地址產生的hash值。

         此處多說一下hashCode()方法和identityHashCode(Object x);的區別

          hashCode();方法返回的是物件重寫hashCode後的hashCode值,如果沒有重寫hashCode,則返回的值和IdentityHashCode是一樣的。

           identityHashCode(Object x);返回的永遠是物件的hash初始值,就是實體記憶體地址產生的hash值

18、Properties  getProperties();

        獲取系統屬性資料  預設系統屬性有55種。

19、String   lineSeparator();

        返回與作業系統相關的行分隔符字串,一般返回的值都一樣。  分隔符字串,在系統類載入時,jvm會自動獲取當前作業系統預設的換行符。

         這裡需要注意的是,在實際開發中常常會用到換行,介意不要直接用 "\n\r" 寫死,因為在不同的作業系統中換行符可能是不同的,如果寫死。就實現不了java的跨平臺可移植性。  這裡介意用 lineSeparator();方法或者用System.getProperty("line.separator");獲取換行符

20、setProperties(Properties  props);

        設定系統屬性,這裡需要謹慎使用。因為一旦自定義系統屬性後,會自動替換掉原先的屬性列表。

21、 String  getProperty(String key);

        通過指定key值,獲取系統屬性value值

22、String  getProperty(String key,String def);  

        通過指定key值,獲取系統屬性value值,如果獲取不到,使用預設值def。

23、String  setProperty(String key,String value);

        向系統屬性中新增屬性資訊

24、clearProperty(String key);

        刪除指定key值的系統屬性資訊

25、Map<String,String>  getenv();

       獲取當前作業系統中,所有配置的環境變數

26、String getenv(String name);

       通過指定環境變數名稱,獲取當前系統中的環境變數值。

27、exit(int status);

        終止java虛擬機器,status標識狀態,不是0標識異常終止   Runtime.getRuntime().exit(int status);

28、gc();

        執行垃圾回收,建議java虛擬機器花費精力回收未被使用的物件,以便使這些佔據的記憶體快速得到重用。

29、runFinalization();

        執行處於終止狀態的所有物件的終止方法,由於java虛擬機器做了努力執行被丟棄物件的finalize()方法,但是由於沒寫原因,這些方法卻並沒有被執行。執行runFinalization();方法可以將被丟棄終止狀態的物件最大程度的執行終止方法。

30、load(String filename);

        裝在庫檔案,放置庫檔案的絕對路徑

31、loadLibary(String libName);

        裝在庫,引數為庫檔名

32、native String  mapLibaryName(String libName)

        將庫名對映為特定平臺的字串