天天說用System.out.println來輸出,那我有個小問題想請教,out是一個變數還是內部類別呢?大型而係統的知識都有各種專題來詳解,這些散碎的知識點我們也不能忽視,否則面試的時候被問到這麼簡單的問題,答不上來,就很尷尬了。
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()在控制台輸出內容。
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方法和Date類別中getTime方法完全是一樣的,如果只是需要毫秒數,這樣的呼叫也是很方便的。但是要注意的是currentTimeMillis並不是直接拿到了getTime的結果,currentTimeMillis是一個本地方法,返回的是操作系統的時間,由於有的操作系統時間的最小精確度是10毫秒所以這個方法可能會導致一些偏差。
#我們透過呼叫這個方法,在參數中輸入鍵的字串取得系統的屬性。
鍵 | 相關值的描述 |
---|---|
java.version | Java 執行階段環境版本 |
java.vendor | Java執行階段環境供應商 |
java.vendor.url | Java 供應商的URL |
java.home | #Java 安裝目錄 |
java.vm.specification.version | Java 虛擬機器規格版本 |
#java.vm.specification.vendor | Java 虛擬機器規格供應商 |
java.vm.specification.name | Java 虛擬機器規格名稱 |
java.vm.version | Java 虛擬機器實作版本 |
java.vm.vendor | Java 虛擬機器實作供應商 |
java.vm.name | Java 虛擬機器實作名稱 |
java.specification.version | Java 執行階段環境規格版本 |
java.specification.vendor | ##Java 執行階段環境規格供應商|
##Java 運行時環境規範名稱 | |
.versionJava 類別格式版本號 | |
Java 類別路徑 | |
載入程式庫時 | 搜尋的路徑列表 |
預設的暫存檔案路徑 | ##java.compiler |
java.ext.dirs | |
## os.name | |
os.arch | |
os.version | |
#file | |
檔案分隔符號(在UNIX 系統中是「/」) | path.separator |
#line.separator | |
user.name | ##用戶的帳號名稱|
user.home | 用戶的主目錄 |
##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中文網其他相關文章!
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
npx create-react-app 指令出現錯誤,我該如何解決?
我一直在嘗試使用'npxcreate-react-app'命令創建一個新的React應用,但似乎對我來說無效。最近有其他人遇到這個問題嗎?我有一個穩定的互聯網連接,並確保我的系統上...
來自於 2024-04-05 14:42:18
0
1
3511
React TS錯誤:使用Types時缺少屬性
我正在嘗試製作一個過濾系統,但遇到了問題。我設定了幾種類型:typeBrand={brand:string;checked:boolean;}typeGender={gender:...
來自於 2024-04-05 00:24:10
0
1
285
PHP:正規表示式匹配和替換多個重複匹配的多個實例
我正在尋找為遊戲社群/資料庫編寫一個短代碼系統,用戶可以在其中添加諸如((MagicalSword))之類的內容到他們的內容中,它將被解析為指向相關項目的漂亮連結帶有內嵌縮圖。這是...
來自於 2024-04-04 15:41:01
0
1
439
如何使用CSS選擇器來定位包含特定屬性或標籤的div元素?
我正在使用一個產生網站的POS系統。大部分程式碼是專有的,因此我無法編輯很多內容。我有一個輸出的類別列表,其中一些圖像作為類別浮動。我想隱藏主頁上列出的前3個。我嘗試使用div:n...
來自於 2024-04-03 22:25:59
0
1
277
相關專題
更多>
熱門教學
更多>
|