System类是一个由final修饰的类,所以无法被继承,只有一个私有的构造器,所以也无法实例化。
System类所有的属性和方法都是公有 static修饰的,可以由类名直接调用
属性:
InputStream in; 输入流
PrintStream out; 打印输出流
PrintStream err; 标准错误打印输出流,该留已经打开,随时准备接受输出数据
SecurityManager security; java安全管理器
Console cons; 控制台,用于从控制台或设备读取字符串,一般是用户名密码,尤其是密码是不可见的
Properties props ; 系统属性数据,java默认55条属性,其中包括项目用户运行环境文件路径以及换行符等
方法:
1、native void registerNatives();
该方法在类加载时执行。
System类存在静态块
private static native void registerNatives();
static {
registerNatives();
}
根据注释,该方法被执行,jvm会自动调用 initializeSystemClass()方法。而initializeSystemClass方法会将以上输入流,打印输出流,以及安全管理器等属性赋值。在实际应用中我们用到的System.out.println(),就是调用System类中的out打印输出流的println()方法,打印各种数据。
2、setIn(InputStream in)
对类静态变量属性 in 赋值。在System类加载时,会自动调用该方法,创建默认的输入流,内部调用checkIO()方法,标识java安全管理器会校验操作权限
3、setOut(PrintStream out);
对类静态属性out赋值,和setIn(InputStream in);方法类似,都会执行相同的操作
4、setErr(PrintStream err);
赋值静态变量属性err。 和上面setOut(PrintStream out);类似
5、console();
用于构建默认的控制台对象,赋值给变量cons,一般idea是获取不到console的,因为没有控制台,需要在cmd控制台运行程序
6、Channel inheritedChannel() throws IOException;
返回创建类实体的信道 ---java虚拟机
7、checkIO();
java安全管理器校验流操作
8、native void setIn0(InputStream in);
由jvm对输入流进行赋值
9、native void setOut0(PrintStream in);
和setIn0()类似
10、native void setErr0(PrintStream in);
和setErr0()类似
11、setSecurityManager(final SecurityManager s);
自定义java安全管理器
12、setSecurityManager0(final SecurityManager s);
自定义java安全管理器,同步方法,
13、getSecurityManager();
获取java安全管理器
14、native long currentTimeMillis();
获取系统当前时间,毫秒,注意:不同的操作系统对毫秒的测量单位不一样
15、native long nanoTime();
获取当前系统时间 纳秒为单位 注意:1纳秒 = 1毫秒 *1000 * 1000
16、native void arraycopy(object src , int srcPos , object dest , int destPos , int length);
复制数组
参数: src:被复制的数组; srcPos:指定复制索引,从哪个索引开始复制。desc:复制的数组。destPos:从复制数组中哪个索引开始拷贝。length:复制几个元素
比如:
String[] arr = new String[]{"1","2","3","4"};
String[] arr1= new String[]{"5","6","7","8"};
System.arraycopy(arr,1,arr1,0,2);
含义:从数组arr的索引1开始(第二个元素开始)复制,复制2个元素,拷贝到数组arr1,从索引0开始拷贝(第一个元素开始拷贝)。执行完成后,会发现arr1数组的值变成 2 3 7 8
注意:如果如果length长度参数数值大于可复制数组长度,或者为负数,则会抛出ArrayIndexoutofBoundException异常
17、native int identityHashCode(Object x);
返回对象的hashCode值。注意:不管该对象有没有重写hashCode()方法,返回的hashCode值都是根据对象物理内存地址产生的hash值。
此处多说一下hashCode()方法和identityHashCode(Object x);的区别
hashCode();方法返回的是对象重写hashCode后的hashCode值,如果没有重写hashCode,则返回的值和IdentityHashCode是一样的。
identityHashCode(Object x);返回的永远是对象的hash初始值,就是物理内存地址产生的hash值
18、Properties getProperties();
获取系统属性数据 默认系统属性有55种。
19、String lineSeparator();
返回与操作系统相关的行分隔符字符串,一般返回的值都一样。 分隔符字符串,在系统类加载时,jvm会自动获取当前操作系统默认的换行符。
这里需要注意的是,在实际开发中常常会用到换行,介意不要直接用 "\n\r" 写死,因为在不同的操作系统中换行符可能是不同的,如果写死。就实现不了java的跨平台可移植性。 这里介意用 lineSeparator();方法或者用System.getProperty("line.separator");获取换行符
20、setProperties(Properties props);
设置系统属性,这里需要谨慎使用。因为一旦自定义系统属性后,会自动替换掉原先的属性列表。
21、 String getProperty(String key);
通过指定key值,获取系统属性value值
22、String getProperty(String key,String def);
通过指定key值,获取系统属性value值,如果获取不到,使用默认值def。
23、String setProperty(String key,String value);
向系统属性中添加属性信息
24、clearProperty(String key);
删除指定key值的系统属性信息
25、Map<String,String> getenv();
获取当前操作系统中,所有配置的环境变量
26、String getenv(String name);
通过指定环境变量名称,获取当前系统中的环境变量值。
27、exit(int status);
终止java虚拟机,status标识状态,不是0标识异常终止 Runtime.getRuntime().exit(int status);
28、gc();
运行垃圾回收,建议java虚拟机花费精力回收未被使用的对象,以便使这些占据的内存快速得到重用。
29、runFinalization();
运行处于终止状态的所有对象的终止方法,由于java虚拟机做了努力运行被丢弃对象的finalize()方法,但是由于没写原因,这些方法却并没有被运行。执行runFinalization();方法可以将被丢弃终止状态的对象最大程度的执行终止方法。
30、load(String filename);
装在库文件,放置库文件的绝对路径
31、loadLibary(String libName);
装在库,参数为库文件名
32、native String mapLibaryName(String libName)
将库名映射为特定平台的字符串