Java 不支持全局函数和变量,Java 设计者将一些系统相关的重要函数和变量收集到了一个统一的类中,这就是 System 类,System 类中的所有成员都是静态的,当我们要引用这些变量和方法时,直接使用 Sstem类名作前缀,我们前面已经使用到了标准输入和输出的in 和out 变量,关于这两个变量的详细介绍,请看第7章。下面再介绍 System 类中几个方法,其他的方法读者还是参看 JDK 文档资料。
exit(int status)方法,提前终止虚拟机的运行。对于发生了异常情况而想终止虚拟机的运行,传递一个非零值作为参数。对于在用户正常操作下,终止虚拟机的运行,传递零值
作为参数。
CurrentTimeMillis 方法返回自1970年1月1日0点0分0秒起至今的以毫秒为单位的时间,这是一个 long 类型的大数值。在计算机内部,只有数值,没有真正的日期类型及其他各种类型,也就是说,我们平常用到的日期本质上就是一个数值,但通过这个数值,能够推算出其对应的具体日期时间。
getProperties 方法获得当前虚拟机的环境属性。如果大家明白 Windows 的环境属性,如我们在第1章中讲到的 path 和classpath 就是其中的两个环境变量,每一个属性都是变量与值成对的形式出现的。
同样的道理,Java 作为一个虚拟的操作系统,它也有自己的环境属性,Properties 是Hashtable 的子类,正好可以用于存储环境属性中的多个变量/值对格式的数据getProperties
方法返回值是,包含了当前虚拟机的所有环境属性的 Properties 类型的对象
import java.util.*;
public class SystemInfo {
public static void main(String[] args) {
Properties sp = System.getProperties();
Enumeration e = sp.propertyNames();
while (e.hasMoreElements()){
String key = (String) e.nextElement();
System.out.println(key+" = "+sp.getProperty(key));
}
}
}
Runtime类封装了Java命令本身的运行进程其中的许多方法与System中的方法相重复。我们不能直接创建Runtime 实例,但可以通过静态方法RuntimegetRuntime 获得正在运行的Runtime对象的引用。
Exec 方法Java 命令运行后,本身是多任务操作系统上的一个进程,在这个进程中启动一个新的进程,即执行其他程序时使用 exec 方法。exec 方法返回一个代表子进程的Process 类对象,通过这个对象,Java 进程可以与子进程交互
public class TestRuntime {
public static void main(String[] args) {
Process p =null;
try {
p=Runtime.getRuntime().exec("notepad.exe TestRuntime.java");
Thread.sleep(5000);
}catch (Exception e){
System.out.println(e.getMessage());
}
p.destroy();
}
}
Date 类用于表示日期和时间,最简单的构造函数是 Date0,它以当前的日期和时间初始化一个 Date 对象。由于开始设计 Date 时没有考虑到国际化,所以后来又设计了两个新的类来解决 Date 类中的问题,一个是 Calendar 类,一个是 DateFormat 类。
Calendar 类是一个抽象基类,主要用于完成日期字段之间相互操作的功能,如Calendar.add 方法可以实现在某一日期的基础上增加若干天(或年、月、小时、分、秒等日期字段)后的新日期,Calendar.get 方法可以取出日期对象中的年、月、日、小时、分、秒等日期字段的值,Calendar.set 方法修改日期对象中的年、月、日、小时、分、秒等日期字段的值。Calendar.getInstance 方法可以返回一个 Calendar 类型(更确切地说是它的某个子类)的对象实例,GregorianCalendar 类是 JDK 目前提供的一个惟一的 Calendar 子类Calendar.getInstance 方法返回的就是预设了当前时间的GregorianCalendar 类对象。
import java.util.*;
public class TestCalendar {
public static void main(String[] args) {
Calendar c1 = Calendar.getInstance();
System.out.println(c1.get(c1.YEAR)+"年"+(c1.get(c1.MONTH)+1)+"月"+c1.get(c1.DAY_OF_MONTH)+"日"
+c1.get(c1.HOUR)+":"+c1.get(c1.MINUTE)+":"+c1.get(c1.SECOND));
c1.add(c1.DAY_OF_YEAR,315);
System.out.println(c1.get(c1.YEAR)+"年"+(c1.get(c1.MONTH)+1)+"月"+c1.get(c1.DAY_OF_MONTH)+"日"
+c1.get(c1.HOUR)+":"+c1.get(c1.MINUTE)+":"+c1.get(c1.SECOND));
}
}
虽然Calendar类几乎完全替代了 Date类,但在某些情况下,我们仍有可能要用到 Date类,譬如,程序中用的另外一个类的方法要求一个 Date 类型的参数。我们有时要将用 Date对象表示的日期用指定的格式输出和将特定格式的日期字符串转换成一个 Date 对象。Javatext.DateFormat 就是实现这种功能的抽象基类,iavatext.SimpleDateFormat 类是JDK目前提供的一个的 DateFormat 子类,它是一个具体类,使用它就可以完成把 Date 对象格式化为本地字符串,或者通过语义分析把日期或时间字符串转换为 Date 对象的功能
import java.text.*;
import java.util.*;
public class TestDateFormat {
public static void main(String[] args) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
try {
Date d = sdf1.parse("2003-03-15");
System.out.println(sdf2.format(d));
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
当我们要将一个字符串转换成 Date 类对象时,字符串中代表年份的字符必须在模版中 yyyy 的位置,y的个数指定了年的位数,在字符串中除了这些格式字符要被真实的日期数字替代之外,其他的字符必须原样出现,如:表示时间的字符串中的“_”的位置必须和创建 SimpleDateFormmat 类对象时“-”的位置一样,同理,我们将日期转换成的字符串格式也是按照创建 SimpleDateFormat 类对象时指定的字符串格式而输出的。
Math 类包含了所有用于几何和三角的浮点运算函数,这些函数都是静态的,每个方法的使用都非常简单,读者一看JDK 文档就能明白。
Random类是一个伪随机数产生器,随机数是按照某种算法产生的,一旦用--个初值创建Random对象,就可以得到一系列的随机数,但如果用相同的初值创建 Random对象
得到的随机数序列是相同的,也就是说,在程序中我们看到的“随机数”是固定的那些数起不到“随机”的作用,针对这个问题,Java 设计者们在Random类的 Random0构造方法中使用当前的时间来初始化 Random 对象,因为没有任何时刻的时间是相同的,所以就可以减少随机数序列相同的可能性。