咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于 **[「滚雪球学Java」 ](https://blog.csdn.net/weixin_43970743/category_9600553.html)专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅**!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
在Java编程中,System类是一个非常重要的类,它提供了大量的系统级别的操作和属性。在本文中,我们将深入解析System类,掌握Java编程的关键。
Java作为一种广泛应用于各个领域的编程语言,其系统级别的操作和属性是我们必须掌握的知识点之一。而System类就是其中非常重要的一个类,通过学习System类,我们可以更好地理解和应用Java编程语言。
本文将深入解析System类,主要包括以下内容:
System类是Java.lang包中的一个类,它提供了一些静态方法,用于管理程序和系统的一些属性。它包括以下几个方法:
System类是Java.lang
包下的一个类,它提供了大量的系统级别的属性和方法,可用于处理与系统相关的操作。例如,我们可以用System类获取系统的时间、内存信息、环境变量等等。
在Java编程中,System类也经常被用于标准输入和标准输出,例如System.out
和System.in
。通过System类,我们可以实现常见的输入输出操作,从而实现控制台程序开发。
System类是Java中的一个常用类,它提供了一些与系统相关的方法,如获取当前时间、处理输入输出流等。在本文中,我们将对System类的源码进行分析,以更深入地了解它的实现原理和使用方法。
下面是System类的源码:
public final class System {
private System() {}
public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;
public static void setIn(InputStream in) { }
public static void setOut(PrintStream out) { }
public static void setErr(PrintStream err) { }
public static native long currentTimeMillis();
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
public static native void exit(int status);
public static native void gc();
public static native String getenv(String name);
public static native int identityHashCode(Object x);
public static Properties getProperties() { }
public static String getProperty(String key) { }
public static String getProperty(String key, String def) { }
public static String setProperty(String key, String value) { }
public static String clearProperty(String key) { }
public static String lineSeparator() { }
public static void load(String filename) { }
public static void loadLibrary(String libname) { }
}
从源码中可以看到,System类是一个final类,不能被继承。它包含了一些静态变量和静态方法,其中大部分方法都是native方法,即使用C或C++编写的本地方法,系统自动调用。
代码解析:
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
这段代码是一个自定义的System
类的示例,它模仿了Java中的标准System
类的一些特性。然而,有几个关键点需要注意:
System
类有一个私有的构造函数,这意味着不能创建System
类的新实例。这与Java的标准System
类相似,它也是不能实例化的。final static
类型的字段,分别对应标准输入(in
)、标准输出(out
)和标准错误输出(err
)。这里它们被赋值为null
,而在Java的标准System
类中,这些字段指向实际的输入/输出流。setIn
、setOut
和setErr
三个方法,用于设置标准输入、输出和错误输出。这些方法在Java的标准System
类中是不存在的,因为一旦设置了标准输入/输出,它们通常是不可变的。currentTimeMillis
、arraycopy
、exit
、gc
、getenv
、identityHashCode
等方法被声明为native
,这意味着它们需要通过本地代码实现。在Java的标准System
类中,这些方法也是本地方法,但它们有实际的实现。getProperties
、getProperty
、setProperty
、clearProperty
等方法用于管理系统属性。这些方法在Java的标准System
类中也存在,用于获取和设置系统属性。lineSeparator
方法返回当前系统的行分隔符,这与Java的标准System
类中的实现相对应。load
和loadLibrary
方法用于动态加载本地库,这与Java的标准System
类提供的功能相同。System
类中的所有方法都没有实现,它们只是声明了方法签名。 这个自定义的System
类显然是一个框架或学习用的示例,它并不包含Java标准System
类的所有功能和实现。在实际的Java程序中,我们通常会使用Java SDK提供的java.lang.System
类,它包含了所有必要的实现和Java运行时环境的交互。
这三个方法分别设置标准输入流、标准输出流和标准错误流。这些流可以是任意的InputStream、PrintStream或者任意的派生类。当设置完这些流之后,调用System.in、System.out和System.err会使用新的流。
这个方法返回自1970年1月1日00:00:00以来以毫秒为单位的当前时间。
这个方法将一个数组的元素复制到另一个数组中。src参数是源数组,srcPos是源数组中要复制的起始位置,dest是目标数组,destPos是目标数组中要复制的起始位置,length是要复制的元素数量。
这个方法终止正在运行的Java虚拟机。status参数指定了退出状态码,为0表示正常退出,非0表示异常退出。
这个方法请求系统进行垃圾回收。
这个方法获取系统环境变量的值。
这个方法返回给定对象的哈希码。
这个方法返回当前系统的属性集。
这个方法获取指定的系统属性值。如果没有找到属性,则返回null。
这个方法设置指定属性的值。
这个方法移除指定的属性。
这个方法返回当前系统的行分隔符。
这两个方法分别在指定的文件中加载一个属性列表和指定的动态链接库。
System类提供的常用属性和方法如下:
System.exit(int status)
该方法用于终止Java虚拟机,并返回一个指定的状态码。一般情况下,status为0表示正常退出,非零值表示异常退出。
例如:
package com.demo.javase.day44;
/**
* 演示 System.exit(int status)
*
* @author bug菌
* @version 1.0
* @date 2023/10/10 10:39
*/
public class TestSystemExit {
public static void main(String[] args) {
System.out.println("Hello World!");
System.exit(0);
System.out.println("Hello World!!!"); //不会被执行(控制台不会输出)
}
}
执行结果如下:
这段代码中包含了一个静态方法 main。在该方法中:
因此,该程序在执行时只会输出一句话 "Hello World!",并且状态码为 0。
System.currentTimeMillis()
该方法返回当前时间与1970年1月1日00:00:00之间的差值,单位为毫秒。
例如:
package com.demo.javase.day44;
/**
* 演示 System.currentTimeMillis()
*
* @author bug菌
* @version 1.0
* @date 2023/10/10 10:47
*/
public class TestSystemCurrentTimeMillis {
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
System.out.println("开始时间为:" + startTime);
// 执行一些耗时的操作(这里线程睡眠5s作为模拟)
Thread.sleep(5000);
long endTime = System.currentTimeMillis();
System.out.println("结束时间为:" + endTime);
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
}
执行结果如下:
该段代码演示了如何使用Java中的System类的currentTimeMillis()方法来计算程序的执行时间。
最后,我们通过计算endTime与startTime的时间差来计算程序的运行时间,并将其打印输出。
该程序的核心是利用currentTimeMillis()获取时间戳,然后通过计算时间差来计算程序运行时间,是一种简单而有效的计时方法。
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
该方法用于将数组src中从索引srcPos开始的length个元素复制到数组dest中的索引destPos开始的位置。
例如:
package com.demo.javase.day44;
import java.util.Arrays;
/**
* 演示 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
*
* @author bug菌
* @version 1.0
* @date 2023/10/10 10:52
*/
public class TestSystemArraycopy {
public static void main(String[] args) {
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, 5);
System.out.println(Arrays.toString(dest));
}
}
执行结果如下:
这是一个演示使用 System.arraycopy() 方法进行数组复制的示例代码。该方法的参数包括源数组、源数组的起始位置、目标数组、目标数组的起始位置以及要复制的数组元素个数。在这个示例中,源数组是 {1, 2, 3, 4, 5},目标数组是一个长度为 5 的空数组,通过该方法将源数组的所有元素复制到目标数组中,最终打印输出目标数组的元素,即 {1, 2, 3, 4, 5}。
System.getenv(String name)
该方法用于获取系统环境变量name的值。
例如:
package com.demo.javase.day44;
/**
* 演示 System.getenv(String name)
*
* @author bug菌
* @version 1.0
* @date 2023/10/10 10:55
*/
public class TestSystemGetenv {
//获取系统环境变量name的值
public static void main(String[] args) {
String javaHome = System.getenv("JAVA_HOME");
System.out.println("JAVA_HOME:" + javaHome);
System.out.println("CLASSPATH:"+System.getenv("CLASSPATH"));
}
}
执行结果如下:
这段代码演示了如何使用Java的System类中的getenv方法获取系统环境变量的值。其中,通过传入不同的参数获取不同的环境变量值,例如获取JAVA_HOME的值和CLASSPATH的值。最终,将获取到的值打印输出到控制台。
System.getProperties()
该方法返回一个Properties对象,包含了当前Java虚拟机的系统属性。
例如:
package com.demo.javase.day44;
import java.util.Enumeration;
import java.util.Properties;
/**
* 演示 System.getProperties()方法
*
* @author bug菌
* @version 1.0
* @date 2023/10/10 11:00
*/
public class TestSystemGetProperties {
//返回一个Properties对象,包含了当前Java虚拟机的系统属性
public static void main(String[] args) {
Properties props = System.getProperties();
Enumeration<?> e = props.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = (String) props.get(key);
System.out.println(key + " = " + value);
}
}
}
执行结果如下:
这段代码演示了使用 System.getProperties() 方法获取当前 Java 虚拟机的系统属性,然后通过遍历 properties 对象中的键值对将其输出到控制台。
具体解析如下:
import java.util.Enumeration;
import java.util.Properties;
public static void main(String[] args) {
Properties props = System.getProperties();
// ...
}
其中,System.getProperties() 方法返回一个 Properties 对象,包含了当前 Java 虚拟机的系统属性。
Enumeration<?> e = props.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = (String) props.get(key);
System.out.println(key + " = " + value);
}
其中,props.propertyNames() 方法返回一个枚举类型的对象,该对象包含了 properties 对象中的所有键的枚举。
然后使用 while 循环遍历该枚举对象,获取每个键值对的键和值,最后将其输出到控制台。
因此,此段代码的作用是输出当前 Java 虚拟机的所有系统属性。
System.setOut(PrintStream out)
该方法用于将System.out设置为指定的输出流out。
例如:
package com.demo.javase.day44;
import java.io.FileOutputStream;
import java.io.PrintStream;
/**
* @author bug菌
* @version 1.0
* @date 2023/10/10 11:02
*/
public class TestSystemSetOut {
//该方法用于将System.out设置为指定的输出流out
public static void main(String[] args) {
try {
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);
System.out.println("Hello World!");
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果如下:
该代码演示了如何将Java程序中的标准输出流System.out设置为指定的输出流,具体步骤如下:
该代码的运行结果是,在程序执行完毕后,会在项目根目录下生成一个名为output.txt的文件,其中包含了输出的信息"Hello World!"。
System类在Java编程中有广泛的应用,主要包括以下方面:
System.out
、System.in
和System.err
等。System.currentTimeMillis()
、System.getProperties()
和System.getenv()
等。System.arraycopy()
等。System.exit()
等。通过学习System类,我们可以更好地应用Java编程语言,实现更加高效、稳定和可靠的程序开发。
在Java的世界中,System
类扮演着一个关键角色,它提供了与系统操作和属性相关的丰富接口。通过今天的学习,我们不仅揭开了System
类的神秘面纱,还深入理解了它在Java编程中的多样化应用。
首先,我们了解到System
类是java.lang
包的一部分,这意味着它的核心地位和对Java程序的普遍影响。它的静态方法让我们能够执行垃圾回收、获取当前时间戳、操作输入输出流等。这些功能在日常编程中至关重要,它们帮助我们与Java虚拟机(JVM)进行交互和管理程序行为。
通过源码分析,我们认识到System
类的方法是如何实现的,尤其是那些使用native
关键字的方法,它们通过本地代码与底层系统进行交互。虽然示例中的System
类方法没有具体实现,但它们在Java SDK中都有各自的实际用途。
在实际应用中,System
类的方法被广泛用于获取系统属性、管理环境变量、执行数组复制等操作。这些方法不仅提高了编程效率,也使得代码更加简洁和易于理解。
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
通过本文的学习,我们对System
类有了全面的认识。从基本概念到实际应用,从方法说明到源码分析,每一个环节都让我们对Java的系统级别操作有了更深刻的理解。
System
类作为Java语言的基石之一,它的属性和方法为Java程序提供了强大的支持。无论是控制台的输入输出,还是系统级别的信息获取,System
类都提供了简洁而高效的解决方案。
此外,通过实际的代码示例,我们看到了如何使用System
类的方法来解决具体问题。这些示例不仅加深了我们对System
类的理解,也展示了Java编程的实用性和灵活性。
最后,我们鼓励每一位Java学习者和开发者,继续探索和学习Java的更多知识。System
类只是冰山一角,Java的世界还有更多宝藏等待我们去发掘。同时,不要忘记关注bug菌的专栏和公众号「猿圈奇妙屋」,获取更多Java编程的知识和资源。
学习永无止境,技术不断进步。希望每位读者都能在编程的道路上不断前行,探索更多的可能。如果你觉得这篇文章对你有帮助,不妨关注、点赞、收藏,支持我们继续创作更多高质量的内容。
愿每一位Java程序员都能在知识的海洋中乘风破浪,不断前行。
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。 同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金等平台签约作者,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。
--End
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。