5、
System
System类保存静态方法和变量的集合。标准的输入,输出和Java运行时错误输出存储在变量in,out和err中。由System类定义的方法列在表14-11中。注意当所做操作是安全方式所不允许的时,许多方法引发一个安全异常(SecurityException)。应当注意的另一点是:Java 2不赞成使用runFinalizersonExit( )方法。该方法是在Java 1.1中增加的,同时也被证明是不可靠的。
让我们看一看System类的一些普遍用法。
表11
由Sysem定义的方法
方法 描述
static void arraycopy(Object source, int
sourceStart, Object target, int targetStart,
int size) 复制数组。被复制的数组由source传递,而source中开始复制数组时的下标由sourceStart传递。接收复制的数组由target传递。而target中开始复制数组时的下标由targetStart传递。Size是被复制的元素的个数
static long currentTimeMillis( )
返回自1970年1月1日午夜至今的时间,时间单位为毫秒。
static void exit(int exitCode)
暂停执行,返回exitCode值给父进程(通常为操作系统)。按照约定,0表示正常退出,所有其他的值代表某种形式的错误
static void gc( )
初始化垃圾回收
static Properties getProperties( )
返回与Java运行系统有关的属性类(Properties class)将在第15章中介绍)
static String getProperty(String which)
返回与which有关的属性。如果期望的属性没有被发现,返回一个空对象(null object)
static String getProperty(String which,
String default) 返回一个与which有关的属性。如果期望的属性没有被发现,则返回default
static SecurityManager getSecurityManager( )
返回当前的安全管理程序,如果没有安装安全管理程序,则返回一个空对象(null object)
static native int identityHashCode(Object obj)
返回obj的特征散列码
static void load(String libraryFileName)
载入其文件由libraryFileName指定的动态库,必须指定其完全路径
static void loadLibrary(String libraryName)
载入其库名为libraryName的动态库
static String mapLibraryName(String lib)
对应名为lib的库,返回一个指定平台的名字(在Java 2中新增加的)
static void runFinalization( )
启动调用不用的但还不是回收站中的对象的finalize( )方法。
static void setErr(PrintStream eStream)
设置标准的错误(err)流为iStream
static void setIn(InputStream iStream)
设置标准的输入(in)流为oStream
static void setOut(PrintStream oStream) 设置标准的输出(out)流eStream
static void
setProperties(Properties sysProperties) 设置由sysProperties指定的当前系统属性
Static String setProperty(String which,
String v)
将v值赋给名为which的属性(在Java 2中新增加的)
static void setSecurityManager ( SecurityManager secMan) 设置由secMan指定的安全管理程序
5.1、
使用currentTimeMillis( )记录程序执行的时间
可以发现System类的一个特别有意义的用法是利用currentTimeMillis( )方法来记录你的程序的不同部分的执行时间。currentTimeMillis( )方法返回自从1970年1月1号午夜起到现在的时间,时间单位是毫秒。如果要记录你的程序中一段有问题程序的运行时间可以在这段程序开始之前存储当前时间,在该段程序结束之际再次调用currentTimeMillis( )方法。执行该段程序所花费的时间为其结束时刻的时间值减去其开始时刻的时间值。下面的程序说明了这一点:
// Timing program execution.
class Elapsed {
public static void main(String args[]) {
long start, end;
System.out.println("Timing a for loop from 0 to 1,000,000");
// time a for loop from 0 to 1,000,000
start = System.currentTimeMillis(); // get starting time
for(int i=0; i
end = System.currentTimeMillis(); // get ending time
System.out.println("Elapsed time: " + (end-start));
}
}
这里是程序运行的一个输出样本(记住你的程序的运行结果可能与此不同):
Timing a for loop from 0 to 1,000,000
Elapsed time: 10
5.2、
使用arraycopy( )
使用arraycopy( )方法可以将一个任意类型的数组快速地从一个地方复制到另一个地方。这比使用Java中编写的循环要快的多。下面是一个用arraycopy( )方法复制两个数组的例子。首先,将数组a复制给数组b,接下来,数组a中的所有元素向后移一位,然后数组b中元素向前移一位。
// Using arraycopy().
class ACDemo {
static byte a[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 };
static byte b[] = { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 };
public static void main(String args[]) {
System.out.println("a = " + new String(a));
System.out.println("b = " + new String(b));
System.arraycopy(a, 0, b, 0, a.length);
System.out.println("a = " + new String(a));
System.out.println("b = " + new String(b));
System.arraycopy(a, 0, a, 1, a.length - 1);
System.arraycopy(b, 1, b, 0, b.length - 1);
System.out.println("a = " + new String(a));
System.out.println("b = " + new String(b));
}
}
正如从下面的输出中看到的那样,可以使用相同的源和目的在任一方向进行复制:
a = ABCDEFGHIJ
b = MMMMMMMMMM
a = ABCDEFGHIJ
b = ABCDEFGHIJ
a = AABCDEFGHI
b = BCDEFGHIJJ
5.3 、 环境属性
下面的属性在Java 2的所有环境中可以使用:
file.separator java.vendor.url os.arch
java.class.path java.version os.name
java.class.version java.vm.name os.version
java.ext.dirs java.vm.specification.name Path.separator
java.home java.vm.specification.vendor User.dir
java.specification.name java.vm.specification.version User.home
java.specification.vendor java.vm.vendor User.name
java.specification.version java.vm.version
java.vendor line.separator
可以通过调用System.getProperty( )方法来获得不同环境变量的值。例如下面的程序显示当前用户目录的路径:
class ShowUserDir {
public static void main(String args[]) {
System.out.println(System.getProperty("user.dir"));
}
}
6、
Object
正如我们在第1部分所提及的,Object类是其他所有类的一个超类。表14-12给出了Object类中定义的方法,这些方法对于每一个对象都是可用的。
表12
由Object定义的方法
方法 描述
Object clone( )
Throws
CloneNotSupportedException 创建一个与调用对象一样的新对象
Boolean equals(Object object) 如果调用对象等价于object返回true
void finalize( )
throws Throwable 默认的finalize( )方法。常常被子类重载
final Class getClass( )
获得描述调用对象的Class对象
int hashCode( )
返回与调用对象关联的散列码
final void notify( )
恢复等待调用对象的线程的执行
final void notifyAll( )
恢复等待调用对象的所有线程的执行
String toString( )
返回描述对象的一个字符串
final void wait( )
throws InterruptedException 等待另一个执行的线程
final void wait(long milliseconds)
throws InterruptedException 等待直至指定毫秒数的另一个执行的线程
final void wait(long milliseconds,
int nanoseconds)
throws InterruptedException 等待直至指定毫秒加毫微秒数的另一个执行的线程
7、
使用clone( )和Cloneable接口
由Object类定义的绝大部分方法在本书其他部分讨论。而一个特别值得关注的方法是clone( )。clone( )方法创建调用它的对象的一个复制副本。只有那些实现Cloneable接口的类能被复制。
Cloneable接口没有定义成员。它通常用于指明被创建的一个允许对对象进行位复制(也就是对象副本)的类。如果试图用一个不支持Cloneable接口的类调用clone( )方法,将引发一个CloneNotSupportedException异常。