Java的System类和几个方法-11月4日讲课内容
System 类
System
类包含一些有用的类字段和方法。它不能被实例化。
在 System
类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
成员变量
// 标准输入流,常用于键盘录入
public final static InputStream in = null
// 标准输出流,常用于打印信息
public final static PrintStream out = null;
// 标准错误输出流,常用于打印错误信息
public final static PrintStream err = null;
public class SystemFieldDemo {
public static void main(String[] args) {
// 通过Scanner测试标准输入
Scanner sc = new Scanner(System.in);
String next = sc.next();
// 通过System.out.print测试标准输出流
System.out.println(next);
sc.close();
// 通过System.err.print测试标准输出流
System.err.println("打印错误报告");
}
}
构造方法
构造方法私有化,无法创建对象
/** Don't let anyone instantiate this class */
private System() {
}
arraycopy()
这个方法表示复制数组,从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
参数解释
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
public class ArraycopyDemo {
public static void main(String[] args) {
// 创建一个长度为5的int类型数组arr
int[] arr = new int[5];
// 为数组arr赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
// 遍历数组arr
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("------------------");
// 创建一个新的长度为5的int类型数组newArr
int[] newArr = new int[5];
// 调用System的arraycopy方法,分别传入对应的参数
System.arraycopy(arr, 0, newArr, 0, 5);
// 遍历newArr数组
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
}
}
}
currentTimeMills()
返回以毫秒为单位的当前时间。
public static native long currentTimeMillis();
【注意】
1、这个方法的返回值是long类型
2、当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)
public class CurrentTimeMillsDemo {
public static void main(String[] args) {
long currentTimeMillis = System.currentTimeMillis();
System.out.println("毫秒:" + currentTimeMillis);
System.out.println("年:" + currentTimeMillis/1000/60/60/24/365);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(currentTimeMillis);
System.out.println(date); // 2020-10-06 17:53:02
}
}
gc()
运行垃圾回收器。在此之前会调用Object的finalize()
public static void gc()
System.gc()可用于垃圾回收。当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现。
class Person {
private String name;
private int age;
// 构造方法,getter、setter方法、toString方法
/*
* 通过重写finalize方法验证调用gc会执行此方法
*/
@Override
protected void finalize() throws Throwable {
System.out.println("执行finalize方法回收垃圾:" + this);
super.finalize();
}
}
public class GcDemo {
public static void main(String[] args) {
System.out.println(new Person("张三", 16));
System.gc();
}
}
从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。
但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好
exit()
终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
public static void exit(int status)
public class ExitDemo {
public static void main(String[] args) {
System.out.println("程序执行开始");
// 执行此方法后关闭虚拟机,程序不会再向下执行
System.exit(0);
System.out.println("程序执行结束");
}
}
总结
System类提供了一些和系统相关的类字段和方法,便于我们和底层进行交互。
比较常用的就是arraycopy()和currentTimeMills(),其他不需要关注