第14章java.lang研究本章讨论那些由java.lang定义的类和接口。正如你所知道的那样,java.lang被自动导入所有的程序。它所包含的类和接口对所有实际的Java程序都是必要的。它是Java最广泛使用的包。java.lang包括了下面这些类:BooleanLongStrictMath(Java2,1.3)ByteMathStringCharacterNumberStringBufferClassObjectSystemClassLoaderPackage(Java2)ThreadCompilerProcessThreadGroupDoubleRuntimeThreadLocal(Java2)FloatRuntimePermission(Java2)ThrowableInheritableThreadLocal(Java2)SecurityManagerVoidIntegerShort另外还有两个由Character定义的类:Character.Subset和Character.UnicodeBlock,它们是在Java2中新增加的。java.lang也定义了如下的接口:·Cloneable·Comparable·Runnable其中Comparable接口是在Java2中新增加的。java.lang中的几个类包含了过时的方法,其中的大多数可以追溯到Java1.0。在Java2中仍然提供了这些方法,用于支持逐渐减少的老程序,而这些方法在新程序中不被推荐使用。大多数的过时方法出现在Java2之前,因此在这里不讨论这些方法。而在Java2中出现的那些过时的方法将被提及。Java2也在java.lang包中增加了几个新的类和方法,这些新类和方法被说明如下。14.1简单类型包装器在本书的第1部分,我们提到因为性能的原因,Java使用简单的类型,例如整型(int)和字符(char)。这些数据类型不是对象层次结构的组成部分。它们通过值传递给方法而262第2部分Java库不能直接通过引用传递。而且,也没有办法使两种方法对整型(int)引用同一实例(sameinstance)。有时需要对这些简单的类型建立对象表达式。例如在第15章中讨论的仅仅处理对象的枚举类;如果要将简单类型存储到这些类中的一个,需要在类中包装简单类型。为了满足这种需要,Java提供了与每一个简单类型相应的类。本质上,这些类在类中包装(wrap)简单类型。因此,它们通常被称作类型包装器(wrappers)。14.1.1Number抽象类Number定义了一个由包装数字类型字节型(byte),短整型(short),整型(int),长整型(long),浮点型(float)和双精度型(double)的类实现的超类。Number有返回上面不同数字格式的对象值的抽象方法。也就是,doubleValue()方法返回双精度(double)值,floatValue()方法返回浮点(float)值等。这些方法如下:bytebyteValue()doubledoubleValue()floatfloatValue()intintValue()longlongValue()shortshortValue()这些方法的返回值可以被舍入。Number有6个具体的子类包含了6种数字类型的显式值:双精度型(Double),浮点型(Float),字节型(Byte),短整型(Short),整型(Integer)和长整型(Long)。14.1.2Double和Float双精度(Double)和浮点(Float)分别是对类型double和类型float的浮点值的包装器。浮点(Float)构造函数如下所示:Float(doublenum)Float(floatnum)Float(Stringstr)引发NumberFormatException异常正如你所看到的,浮点(Float)对象可以由类型float或类型double的值创建。它们也能由浮点数的字符串表达式创建。双精度(Double)构造函数如下:Double(doublenum)Double(Stringstr)引发NumberFormatException异常双精度(Double)对象可以被双精度(double)值或包含了浮点值的字符串创建。由浮点(Float)定义的方法在表14-1中列出。由双精度(Double)定义的方法在表14-2中列出。浮点(Float)和双精度(Double)都定义了下面的常数:MAX_VALUE最大正值MIN_VALUE最小正值NaN非数字第14章java.lang研究263POSITIVE_INFINITY正无穷NEGATIVE_INFINITY负无穷TYPE浮点(float)或双精度(double)的类(Class)对象表14-1由Float定义的方法方法描述bytebyteValue()返回调用对象的值(字节型)intcompareTo(Floatf)将调用对象的数值与f中的数值进行比较,如果两者相等,返回0。如果调用对象的值小于f的值,则返回负值。如果调用对象的值大于f的值,则返回正值(在Java2中新增加的)intcompareTo(objectobj)当obj是类Float中的对象时,该方法与compareTo(Float)的功能相同。否则,引发一个ClassCastException异常(在Java2中新增加的)doubledoubleValue()返回调用对象的值(双精度型)booleanequals(ObjectFloatObj)如果float调用对象与FloatObj相等,则返回true。否则返回falsestaticintfloatToIntBits(floatnum)返回与num相应的与IEEE兼容的单精度位模式FloatfloatValue()返回调用对象的值(浮点型)inthashCode()返回调用对象的散列值staticfloatintBitsToFloat(intnum)返回由num指定的,与IEEE兼容的单精度位模式的等价浮点(float)值intintValue()返回整型(int)形式的调用对象值booleanisInfinite()如果调用对象包含有无穷大值,则返回true。否则返回falsestaticbooleanisInfinite(floatnum)如果num指定了一个无穷大值,则返回true。否则返回falsebooleanisNaN()如果调用对象中包含了非数字值,则返回true。否则返回falsestaticbooleanisNaN(floatnum)如果num指定了一个非数字值,则返回true。否则返回falselonglongValue()返回调用对象的值(长整型)staticfloatparseFloat(Stringstr)throwsNumberFormatException以10为基数,返回包含在由str指定的字符串中的数字的等价浮点值(在Java2中新增加的)shortshortValue()返回调用对象值(短整型)StringtoString()返回调用对象的等价字符串形式staticStringtoString(floatnum)返回由num指定的值的等价字符串staticFloatvalueOf(Stringstr)throwsNumberForamtException返回包含了由str中的字符串指定的值的float对象264第2部分Java库表14-2由Double定义的方法方法描述bytebyteValue()返回调用对象的值(字节型)intcompareTo(Doubled)将调用对象的值与d的数值进行比较。如果这两个值相等,则返回0。如果调用对象的数值小于d的数值,则返回负值。如果调用对象的数值大于d的数值,则返回正值(在Java2中新增加的)IntcompareTo(Objectobj)如果obj属于类Double,其操作与compareTo(Double)相同。否则,引发一个ClassCastException异常(在Java2中新增加的)staticlongdoubleToLongBits(doublenum)返回与num相应的与IEEE兼容的双精度位模式doubledoubleValue()返回调用对象的值(双精度)booleanequals(ObjectDoubleObj)如果double调用对象与DoubleObj相等,则返回true。否则,返回falsefloatfloatValue()返回调用对象的值(浮点型)inthashcode()返回调用对象的散列码intintValue()返回调用对象的值(整型)booleanisInfinite()如果调用对象包含了一个无穷大值,则返回true。否则,返回falsestaticbooleanisInfinite(doublenum)如果num指定了一个无穷大值,则返回true。否则,返回falsebooleanisNaN()如果调用对象包含了一个非数字值,则返回true。否则,返回falsestaticbooleanisNaN(doublenum)如果num指定了一个非数字值,则返回true。否则,返回falsestaticdoublelongBitsToDouble(longnum)返回由num指定的,与IEEE兼容的双精度位模式的双精度(double)等价值longlongValue()返回调用对象的值(长整型)staticdoubleparseDouble(Stringstr)throwsNumberFormatException以10为基数,返回包含在由str指定的字符串中的数字的等价双精度(double)形式(在Java2中新增加的)shortshortValue()返回调用对象的值(短整型)StringtoString()返回调用对象的等价字符串形式StaticStringtoString(doublenum)返回由num指定的值的等价字符串形式StaticDoublevalueOf(Stringstr)throwsNumberFormatException返回包含了由str中的字符串指定的值的double对象在下面的例子中创建两个double对象——一个通过使用双精度(double)值实现,另一个通过传递一个可以被解析为双精度(double)的字符串来实现。第14章java.lang研究265classDoubleDemo{publicstaticvoidmain(Stringargs[]){Doubled1=newDouble(3.14159);Doubled2=newDouble(314159E-5);System.out.println(d1+=+d2+-+d1.equals(d2));}}正如从下面的输出中可以看到的那样,如同通过equals()方法返回true,两种构造函数创建相同的双精度(double)实例。3.14159=3.14159–true理解isInfinite()和isNaN()浮点(Float)和双精度(Double)提供了isInfinite()和isNaN()方法,这些方法会有助于操作两个特殊的双精度(double)和浮点(float)值,这些方法检验两个由IEEE浮点规范定义的独特的值:无穷和NaN(非具体数字)。当被检验的值为无穷大或无穷小值时,isInfinite()方法返回true。当被检验值为非数字时,isNaN()方法返回true。在下面的例子中构造了两个Double对象;一个是无穷,另一个是非数字://DemonstrateisInfinite()andisNaN()classInfNaN{publicstaticvoidmain(Stringargs[]){Doubled1=newDouble(1/0.);Doubled2=newDouble(0/0.);System.out.pri