java-System系统类的深入解析
天天说用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.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.specification.name | Java 运行时环境规范名称 |
java.class.version | Java 类格式版本号 |
java.class.path | Java 类路径 |
java.library.path | 加载库时搜索的路径列表 |
java.io.tmpdir | 默认的临时文件路径 |
java.compiler | 要使用的 JIT 编译器的名称 |
java.ext.dirs | 一个或多个扩展目录的路径 |
os.name | 操作系统的名称 |
os.arch | 操作系统的架构 |
os.version | 操作系统的版本 |
file.separator | 文件分隔符(在 UNIX 系统中是“/”) |
path.separator | 路径分隔符(在 UNIX 系统中是“:”) |
line.separator | 行分隔符(在 UNIX 系统中是“/n”) |
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);
Atas ialah kandungan terperinci java-System系统类的深入解析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Tafsiran dokumen Java: Analisis penggunaan kaedah currentTimeMillis() kelas Sistem, contoh kod khusus diperlukan Dalam pengaturcaraan Java, kelas Sistem ialah kelas yang sangat penting, yang merangkumi beberapa sifat dan operasi yang berkaitan dengan sistem. Antaranya, kaedah currentTimeMillis ialah kaedah yang sangat biasa digunakan dalam kelas Sistem Artikel ini akan menerangkan kaedah secara terperinci dan memberikan contoh kod. 1. Gambaran keseluruhan kaedah TimeMillis semasa

Sistem win10 adalah sistem yang sangat mudah digunakan dan sangat pintar Keserasian yang kukuh boleh memastikan bahawa sistem pada asasnya tidak akan menghadapi sebarang masalah semasa penggunaan biasa Walau bagaimanapun, apabila orang terus menggunakan sistem win10, kadangkala sistem itu juga mempunyai masalah. Masalah Win10 boot kod penamatan skrin biru SystemServiceException, hari ini editor akan membawa anda penyelesaian untuk Win10 boot kod penamatan skrin biru SystemServiceException Jika perlu, sila muat turun dengan cepat. Penyelesaian kepada skrin biru win10systemserviceexception: Kaedah 1: 1. Gunakan kekunci Windows + R untuk membuka Run dan masukkan “contr

Sistem komputer adalah proses sistem yang agak biasa Anda akan sering melihat sistem apabila melihat proses ini hanya bermaksud sistem komputer, jika proses system.exe muncul pada komputer, ia perlu dipadamkan. ini adalah fail yang dihasilkan oleh virus kuda Trojan Tiada akhiran exe di sebalik sistem sebenar.

Saya percaya bahawa netizen sangat mengenali sistem Windows 7 Pernahkah anda mendengar tentang sistem versi Bahasa Inggeris Windows 7 Saya percaya bahawa ramai netizen telah mendengar tentang sistem Windows 7 Bahasa Inggeris sistem versi untuk dimuat turun Hari ini saya akan Editor akan berkongsi pengenalan versi asal win7 dalam bahasa Inggeris dengan semua orang, supaya netizen dapat memahami versi asal win7 dalam bahasa Inggeris. Berikut adalah untuk memberitahu anda tempat untuk memuat turun sistem Windows 7 versi Bahasa Inggeris. Sistem bahasa Inggeris asal win7 telah dikeluarkan kepada MSDN untuk muat turun langganan Versi bersepadu bahasa Inggeris rasmi pertama kali dikeluarkan, Windows7WithSP1, iaitu imej CD Windows7 dengan SP1 bersepadu. Termasuk SP1 kendiri untuk berbilang bahasa

Objek ialah kelas asas bagi semua kelas Java, bahagian atas keseluruhan struktur warisan kelas, dan kelas paling abstrak. Semua orang menggunakan toString(), equals(), hashCode(), wait(), notify(), getClass() dan kaedah lain setiap hari Mungkin mereka tidak menyedari bahawa ia adalah kaedah Object, dan mereka tidak melihat apa kaedah lain yang Object ada Dan fikirkan mengapa kaedah ini harus diletakkan dalam Object. 1. Pengenalan kepada kelas JavaObject - kelas super semua kelas Object ialah kelas khas dalam perpustakaan kelas Java dan juga merupakan kelas induk bagi semua kelas. Dalam erti kata lain, Java membenarkan apa-apa jenis objek untuk diberikan kepada jenis Objek

Microsoft telah mengumumkan ketersediaan Pusat Sistem 2022. Versi terkini membawakan Pengurus Operasi Pusat Sistem (SCOM), Pengurus Mesin Maya (VMM), Pengatur Pusat Sistem (SCORCH), Pengurus Perkhidmatan (SM) dan Pengurus Perlindungan Data

Kembali ke masa lalu ke Macintosh tahun 1990-an dan jalankan pemasangan maya lengkap Sistem 7 dan MacOS 8 dalam tetingkap penyemak imbas. Satu kelemahan dengan versi maya baharu perisian Mac 1990-an ialah ia berjalan pada kelajuan Mac 2020-an. Anda sedang melihat MacSE/30 atau Quadra700, tetapi semuanya sepantas Apple Silicon. Anda sebenarnya boleh bekerja dalam sistem pengendalian simulasi ini, malah mereka boleh menyeret dokumen atau fail masuk dan keluar dari macOS Monterey. Tetapi sama ada untuk beberapa tujuan praktikal atau lebih berkemungkinan hanya untuk keseronokan murni, begini caranya

1. Pengenalan kepada Sistem sebagai kelas sistem Dalam pakej java.lang JDK, dapat dilihat bahawa ia juga merupakan ciri bahasa teras Java. Pembina kelas Sistem dihiasi dengan peribadi dan tidak dibenarkan untuk dijadikan instantiated. Oleh itu, kaedah dalam kelas juga adalah kaedah statik yang diubah suai oleh statik. Kelas Tatasusunan dalam JAVA ialah kelas alat yang melaksanakan operasi tatasusunan. Kaedah ini mempunyai kaedah terlebih beban untuk semua jenis asas. 2. Penjelasan terperinci tentang mata pengetahuan 1. Konsep ini agak mudah diperkenalkan dalam kelas Sistem dalam API Kami memberikan definisi.
