Java的System类和几个方法-11月4日讲课内容

2020-11-04T22:50:00

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(),其他不需要关注

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »