目錄
不可實例化的System類" > 不可實例化的System類
欄位" > 欄位
System中常用方法" > System中常用方法
arraycopy——數組拷貝" >arraycopy——數組拷貝
currentTimeMillis——返回毫秒數
屬性" >getProperty取得系統屬性
gc——运行垃圾回收器
exit——退出虚拟机
深度剖析System类源代码" > 深度剖析System类源代码
初始化
设置输入/输出/错误流
首頁 Java java教程 java-System系統類別的深入解析

java-System系統類別的深入解析

May 07, 2017 am 09:40 AM

天天說用System.out.println來輸出,那我有個小問題想請教,out是一個變數還是內部類別呢?大型而係統的知識都有各種專題來詳解,這些散碎的知識點我們也不能忽視,否則面試的時候被問到這麼簡單的問題,答不上來,就很尷尬了。

不可實例化的System類

System作為系統類,在JDK的java.lang套件中,可見它也是一種java的核心語言特性。 System類別的建構器由private修飾,不允許被實例化。因此,類別中的方法也都是static修飾的靜態方法。

欄位

public final static InputStream in;
//标准输入流
public final static PrintStream out;
//标准输出流
public final static PrintStream err;
//标准错误流
登入後複製

由此可見,System中的out和in都不是內部類,而是貨真價實的欄位變數。 out是PrintStream的final static修飾的變數字段,也就是說它可以呼叫PrintStream類別的方法。 println是PrintStream的輸出方法,所以我們通常會採用System.out.println()在控制台輸出內容。

System中常用方法

arraycopy——數組拷貝

  public static void main(String[] args) {

        int[] arr1 = { 0, 1, 2, 3, 4 };
        int[] arr2 = { 9, 9, 9, 9, 9 };

        System.arraycopy(arr1, 2, arr2, 0, 3);

        arr1[3] = 8;

        for (int i = 0; i < 5; i++)
            System.out.print(arr2[i] + " ");
            //2 3 4 9 9 
    }
登入後複製

arraycopy方法五個參數,分別是被複製的數組,被複製的起始位置,複製到的數組,複製到這個數組的起始位置,複製到這個陣列的結束位置。這個方法和Arrays中的copyOf、copyOfRange比較像,參數比較多,如果有需要也可使用。

currentTimeMillis——返回毫秒數

這就不舉例了,currentTimeMillis方法和Date類別中getTime方法完全是一樣的,如果只是需要毫秒數,這樣的呼叫也是很方便的。但是要注意的是currentTimeMillis並不是直接拿到了getTime的結果,currentTimeMillis是一個本地方法,返回的是操作系統的時間,由於有的操作系​​統時間的最小精確度是10毫秒所以這個方法可能會導致一些偏差。

getProperty取得系統屬性

#我們透過呼叫這個方法,在參數中輸入鍵的字串取得系統的屬性。

##Java 執行階段環境規格供應商java.specification.namejava.class java.class.pathjava.library.path搜尋java.io.tmpdir##java.compiler要使用的JIT 編譯器的名稱java.ext.dirs一個或多個擴充目錄的路徑作業系統的名稱#作業系統的架構作業系統的版本#file.separator路徑分隔符號(在UNIX 系統中是「:」)行分隔符號(在UNIX 系統中是「/n」)##用戶的帳號名稱user.home用戶的主目錄
相關值的描述
java.version Java 執行階段環境版本
java.vendorJava執行階段環境供應商
java.vendor.urlJava 供應商的URL
java.home#Java 安裝目錄
java.vm.specification.versionJava 虛擬機器規格版本
#java.vm.specification.vendorJava 虛擬機器規格供應商
java.vm.specification.nameJava 虛擬機器規格名稱
java.vm.versionJava 虛擬機器實作版本
java.vm.vendorJava 虛擬機器實作供應商
java.vm.nameJava 虛擬機器實作名稱
java.specification.versionJava 執行階段環境規格版本
java.specification.vendor
##Java 運行時環境規範名稱
.versionJava 類別格式版本號
Java 類別路徑
載入程式庫時的路徑列表
預設的暫存檔案路徑
## os.name
os.arch
os.version
檔案分隔符號(在UNIX 系統中是「/」)path.separator
#line.separator
user.name
##user.dir用戶的目前工作目錄

在我们操作文件的时候很可能需要使用到我们的当前工作目录,可以用这个方法来获得。

  public static void main(String[] args) {
        String dirPath = System.getProperty("user.dir");
        System.out.println(dirPath);
        //输出工作目录  D:\Workspaces\MyEclipse 10\Algorithms(这是我的目录,每个人都不同)
    }
登入後複製

上面的表中就不再举例了,比较常用的是后几个key

gc——运行垃圾回收器

调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象失去了所有引用的对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

  public static void main(String[] args) {

        Date d = new Date();
        d = null;

        System.gc();
        // 在调用这句gc方法时,上面已经失去了d引用的new Date()被回收

    }
登入後複製

实际上我们并不一定需要调用gc()方法,让编译器自己去做好了。如果调用gc方法,会在对象被回收之前调用finalize()方法,但是我们也知道finalize()方法不一定会被调用。总之java在这回收方面做的远不如c和c++。我们可以规避有关回收方面的问题。当需要了解的时候最好专门的去看JVM回收机制的文章。

exit——退出虚拟机

exit(int)方法终止当前正在运行的 Java 虚拟机,参数解释为状态码。根据惯例,非 0 的状态码表示异常终止。 而且,该方法永远不会正常返回。 这是唯一一个能够退出程序并不执行finally的情况。

  public static void main(String[] args) {

        try {
            System.out.println("this is try");
            System.exit(0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            System.out.println("this is finally");
        }

    }
登入後複製

这段程序最后只会输出 this is try 这一句话,而不会输出 this is finally 。退出虚拟机会直接杀死整个程序,已经不是从代码的层面来终止程序了,所以finally不会执行。

深度剖析System类源代码

看完了表面的方法,我们来继续学习一下System的源代码。还是老样子,找个jdk包打开rt.jar找到java.lang.System类。

初始化

首先映入眼帘的就是一个静态块:

    /* register the natives via the static initializer.
     *
     * VM will invoke the initializeSystemClass method to complete
     * the initialization for this class separated from clinit.
     * Note that to use properties set by the VM, see the constraints
     * described in the initializeSystemClass method.
     */
    private static native void registerNatives();
    static {
        registerNatives();
    }
登入後複製

native不用看了,本机方法。这是可以猜得到的,因为System类要使用输入和输出流可能会用到和操作系统相关的一些本机方法。那么在static块中调用了registerNatives()方法,这个方法是本地方法我们看不到具体实现。但是注释说了:“VM will invoke the initializeSystemClass method to complete the initialization for this class separated from clinit”。

那么JVM调用的initializeSystemClass方法是怎么实现的呢?

    private static void initializeSystemClass() {

        props = new Properties();
        initProperties(props); 

        sun.misc.VM.saveAndRemoveProperties(props);

        lineSeparator = props.getProperty("line.separator");
        sun.misc.Version.init();

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        setIn0(new BufferedInputStream(fdIn));
        setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
        setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));

        loadLibrary("zip");

        Terminator.setup();

        sun.misc.VM.initializeOSEnvironment();

        Thread current = Thread.currentThread();
        current.getThreadGroup().add(current);

        setJavaLangAccess();
        sun.misc.VM.booted();
    }
登入後複製

这个方法就在System类中,但是我们刚才没有介绍,因为是private的方法,只是用来自己做注册使用。我整理了一下源代码去掉了无用的部分。这个方法的大概意思是说:1.初始化Properties 2.初始化输入、输出、错误流 3.进行一大堆配置。

设置输入/输出/错误流

可以注意其中的几行,setIn0,setOut0,setErr0这三个方法。这三个方法是System中public方法setIn,setOut,setErr内部调用的子方法。我们用这几个方法来设置这三个流。

    public static void setIn(InputStream in) {
        checkIO();
        setIn0(in);
    }
登入後複製

比如这是setIn方法,我们使用这个方法来设置输入流(此方法被使用的频率不是很高)。checkIO是检查IO流是否正确,setIn0是native方法,做真正的输入流替换工作。

    private static native void setIn0(InputStream in);
登入後複製

以上是java-System系統類別的深入解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java文件解讀:System類別的currentTimeMillis()方法用法解析 Java文件解讀:System類別的currentTimeMillis()方法用法解析 Nov 03, 2023 am 09:30 AM

Java文件解讀:System類的currentTimeMillis()方法用法解析,需要具體程式碼範例在Java程式設計中,System類是一個非常重要的類,其封裝了與系統相關的一些屬性和操作。其中,currentTimeMillis方法是System類別中非常常用的方法,本文將對此方法做詳細解讀並提供程式碼範例。一.currentTimeMillis方法概述

Win10藍屏錯誤:系統服務異常 Win10藍屏錯誤:系統服務異常 Dec 29, 2023 pm 04:04 PM

win10系統是一款非常好用的高智慧系統,強大的兼容性可以確保系統在正常的使用過程中基本上不會出現任何的問題,但是隨著人們對win10系統的不斷使用有時系統也會出現win10開機藍屏終止代碼systemserviceexception的問題,今天小編就為大家帶來了win10開機藍屏終止代碼systemserviceexception的解決辦法有需要的話就快來下載吧。 win10systemserviceexception藍屏的解決方法:方法一:1、使用Windows鍵+R開啟執行,輸入「contr

電腦的system是什麼 電腦的system是什麼 Feb 22, 2023 am 10:25 AM

電腦的system是比較常見的一種系統進程,在查看進程的時候常常會看到system,這個進程簡單來說就是電腦系統的意思;但是,如果電腦中出現了system.exe的進程,需要及時刪除,這是一個木馬病毒產生的文件,真正的system後邊是沒有exe後綴的。

如何使用Java中的Object類別和System類別? 如何使用Java中的Object類別和System類別? Apr 23, 2023 pm 11:28 PM

Object是java所有類別的基類,是整個類別繼承結構的頂端,也是最抽象的一個類別。大家天天都在使用toString()、equals()、hashCode()、waite()、notify()、getClass()等方法,或許都沒有意識到是Object的方法,也沒有去看Object還有哪些方法以及思考為什麼這些方法要放到Object中。一、JavaObject類別簡介-所有類別的超類別Object是Java類別庫中的一個特殊類,也是所有類別的父類別。也就是說,Java允許把任何類型的物件賦給Object類型的

windows7英文版系統下載 windows7英文版系統下載 Jul 15, 2023 pm 07:45 PM

相信網友們都對windows7系統非常熟悉,那大家聽說過windows7英文版系統嗎?相信有非常多的網友都對windows7英文版系統略有耳聞,不過有的朋友找windows7英文版系統下載,今天小編要把win7英文原版系統介紹分享給大家,讓網友們都能了解到英文win7原版系統。下面就是告訴你windows7英文版系統在哪裡下載。 win7英文原版系統已發佈到MSDN訂閱下載,官方最早發布的英文整合版,Windows7WithSP1,即整合SP1的Windows7光碟鏡像。包含適用於多語言的SP1獨

微軟宣布 System Center 2022 全面上市 微軟宣布 System Center 2022 全面上市 Apr 14, 2023 am 09:40 AM

微軟已宣布System Center 2022 的可用性。最新版本帶來了 System Center Operations Manager (SCOM)、Virtual Machine Manager (VMM)、System Center Orchestrator (SCORCH)、Service Manager (SM) 和 Data Protection Manager

今天如何在瀏覽器中運行 MacOS 7 和 MacOS 8 今天如何在瀏覽器中運行 MacOS 7 和 MacOS 8 Apr 18, 2023 am 11:04 AM

時光倒流回到1990年代的Macintosh,在瀏覽器視窗中執行System7和MacOS8的完整虛擬安裝。 1990年代Mac軟體的新虛擬版本有一個缺陷,那就是它們以2020年代Mac的速度運作。您看到的是MacSE/30或Quadra700,但一切都與AppleSilicon一樣快。您可以在這些模擬作業系統中進行實際工作,它們甚至可以將文件或文件從macOSMonterey拖入和拖出。但無論是出於某些實際目的還是更可能是為了純粹的樂趣,這裡是如何

java System類別和Arrays類別怎麼使用 java System類別和Arrays類別怎麼使用 May 22, 2023 pm 08:52 PM

一.介紹System作為系統類,在JDK的java.lang套件中,可見它也是一種java的核心語言特性。 System類別的建構器由private修飾,不允許被實例化。因此,類別中的方法也都是static修飾的靜態方法。 JAVA中的Arrays類是一個實現對數組操作的工具類,包括了各種各樣的靜態方法,可以實現數組的排序和查找、數組的比較和對數組增加元素,數組的複製和將數組轉換成字串等功能。這些方法都有對所有基本類型的重載方法。二.知識點詳解1、概念在API中System類別介紹的比較簡單,我們給定義

See all articles