欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
對 java.lang 的研究

1、java.lang 研究


本篇文章討論那些由java.lang定義的類(lèi)和接口。
正如你所知道的那樣,java.lang被自動(dòng)導入所有的程序。它所包含的類(lèi)和接口對所有實(shí)際的Java程序都是必要的。它是Java最廣泛使用的包。
java.lang包括了下面這些類(lèi):
Boolean Long StrictMath (Java 2,1.3) 
Byte Math String 
Character Number StringBuffer 
Class Object System 
ClassLoader Package (Java 2) Thread 
Compiler Process >ThreadGroup 
Double Runtime ThreadLocal (Java 2) 
Float >RuntimePermission (Java 2) Throwable 
>InheritableThreadLocal (Java 2) SecurityManager Void 
>Integer >Short > 
另外還有兩個(gè)由Character定義的類(lèi):Character.Subset和Character.UnicodeBlock,它們是在Java 2中新增加的。
java.lang也定義了如下的接口:
 Cloneable
 Comparable
 Runnable
其中Comparable接口是在Java 2中新增加的。
java.lang中的幾個(gè)類(lèi)包含了過(guò)時(shí)的方法,其中的大多數可以追溯到Java 1.0。在Java2中仍然提供了這些方法,用于支持逐漸減少的老程序,而這些方法在新程序中不被推薦使用。大多數的過(guò)時(shí)方法出現在Java 2之前,因此在這里不討論這些方法。而在Java 2中出現的那些過(guò)時(shí)的方法將被提及。
Java 2也在java.lang包中增加了幾個(gè)新的類(lèi)和方法,這些新類(lèi)和方法被說(shuō)明如下。

  1. 1、簡(jiǎn)單類(lèi)型包裝器

在本書(shū)的第1部分,我們提到因為性能的原因,Java使用簡(jiǎn)單的類(lèi)型,例如整型(int)和字符(char)。這些數據類(lèi)型不是對象層次結構的組成部分。它們通過(guò)值傳遞給方法而不能直接通過(guò)引用傳遞。而且,也沒(méi)有辦法使兩種方法對整型(int)引用同一實(shí)例(same instance)。有時(shí)需要對這些簡(jiǎn)單的類(lèi)型建立對象表達式。例如在第15章中討論的僅僅處理對象的枚舉類(lèi);如果要將簡(jiǎn)單類(lèi)型存儲到這些類(lèi)中的一個(gè),需要在類(lèi)中包裝簡(jiǎn)單類(lèi)型。為了滿(mǎn)足這種需要,Java提供了與每一個(gè)簡(jiǎn)單類(lèi)型相應的類(lèi)。本質(zhì)上,這些類(lèi)在類(lèi)中包裝(wrap)簡(jiǎn)單類(lèi)型。因此,它們通常被稱(chēng)作類(lèi)型包裝器(wrappers)。
  1. 1.1、  Number

抽象類(lèi)Number定義了一個(gè)由包裝數字類(lèi)型字節型(byte),短整型(short),整型(int),長(cháng)整型(long),浮點(diǎn)型(float)和雙精度型(double)的類(lèi)實(shí)現的超類(lèi)。Number有返回上面不同數字格式的對象值的抽象方法。也就是,doubleValue( )方法返回雙精度(double)值,floatValue( )方法返回浮點(diǎn)(float)值等。這些方法如下:
byte byteValue( )
double doubleValue( )
float floatValue( )
int intValue( )
long longValue( )
short shortValue( )
這些方法的返回值可以被舍入。
Number有6個(gè)具體的子類(lèi)包含了6種數字類(lèi)型的顯式值:雙精度型(Double),浮點(diǎn)型(Float),字節型(Byte),短整型(Short),整型(Integer)和長(cháng)整型(Long)。
  1. 1.2、  Double和Float
    
雙精度(Double)和浮點(diǎn)(Float)分別是對類(lèi)型double和類(lèi)型float的浮點(diǎn)值的包裝器。浮點(diǎn)(Float)構造函數如下所示:
Float(double num)
Float(float num)
Float(String str) 引發(fā)NumberFormatException異常
正如你所看到的,浮點(diǎn)(Float)對象可以由類(lèi)型float或類(lèi)型double的值創(chuàng )建。它們也能由浮點(diǎn)數的字符串表達式創(chuàng )建。
雙精度(Double)構造函數如下:
Double(double num)
Double(String str) 引發(fā)NumberFormatException異常 
雙精度(Double)對象可以被雙精度(double)值或包含了浮點(diǎn)值的字符串創(chuàng )建。
由浮點(diǎn)(Float)定義的方法在表14-1中列出。由雙精度(Double)定義的方法在表14-2中列出。浮點(diǎn)(Float)和雙精度(Double)都定義了下面的常數:
MAX_VALUE 最大正值 
MIN_VALUE 最小正值 
NaN 非數字 
POSITIVE_INFINITY 正無(wú)窮 
NEGATIVE_INFINITY 負無(wú)窮 
TYPE 浮點(diǎn)(float)或雙精度(double)的類(lèi)(Class)對象  
 表1 由Float定義的方法
方法 描述 
byte byteValue() 返回調用對象的值(字節型) 
int compareTo(Float f) 將調用對象的數值與f中的數值進(jìn)行比較,如果兩者相等,返回0。如果調用對象的值小于f的值,則返回負值。如果調用對象的值大于f的值,則返回正值(在Java 2中新增加的) 
int compareTo(object obj) 當obj是類(lèi)Float中的對象時(shí),該方法與compareTo(Float)的功能相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
double doubleValue() 返回調用對象的值(雙精度型) 
boolean equals(Object FloatObj) 如果float調用對象與FloatObj相等,則返回true。否則返回false 
static int float ToIntBits(float num) 返回與num相應的與IEEE兼容的單精度位模式 
Float floatValue() 返回調用對象的值(浮點(diǎn)型) 
int hashCode() 返回調用對象的散列值 
static float intBitsToFloat(int num) 返回由num指定的,與IEEE兼容的單精度位模式的等價(jià)浮點(diǎn)(float)值 
int intValue() 返回整型(int)形式的調用對象值 
boolean isInfinite() 如果調用對象包含有無(wú)窮大值,則返回true。否則返回false 
static boolean isInfinite(float num) 如果num指定了一個(gè)無(wú)窮大值,則返回true。否則返回false 
boolean isNaN() 如果調用對象中包含了非數字值,則返回true。否則返回false 
static boolean isNaN(float num) 如果num指定了一個(gè)非數字值,則返回true。否則返回false 
long longValue() 返回調用對象的值(長(cháng)整型) 
static float parseFloat(String str)   throws NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)浮點(diǎn)值(在Java 2中新增加的) 
short shortValue() 返回調用對象值(短整型) 
String toString() 返回調用對象的等價(jià)字符串形式 
static String to String(float num) 返回由num指定的值的等價(jià)字符串 
static Float valueOf(String str)   throws NumberForamtException 返回包含了由str中的字符串指定的值的float對象 

表2  由Double定義的方法
方法 描述 
byte byteValue() 返回調用對象的值(字節型) 
int compareTo(Double d) 將調用對象的值與d的數值進(jìn)行比較。如果這兩個(gè)值相等,則返回0。如果調用對象的數值小于d的數值,則返回負值。如果調用對象的數值大于d的數值,則返回正值(在Java 2中新增加的) 
Int compareTo(Object obj) 如果obj屬于類(lèi)Double,其操作與compareTo(Double)相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
static long doubleToLongBits(double num) 返回與num相應的與IEEE兼容的雙精度位模式 
double doubleValue() 返回調用對象的值(雙精度) 
boolean equals(Object DoubleObj) 如果double調用對象與DoubleObj相等,則返回true。否則,返回false 
float floatValue() 返回調用對象的值(浮點(diǎn)型) 
int hashcode() 返回調用對象的散列碼 
int intValue() 返回調用對象的值(整型) 
boolean isInfinite() 如果調用對象包含了一個(gè)無(wú)窮大值,則返回true。否則,返回false 
static boolean isInfinite(double num) 如果num指定了一個(gè)無(wú)窮大值,則返回true。否則,返回false 
boolean is NaN() 如果調用對象包含了一個(gè)非數字值,則返回true。否則,返回false 
static boolean isNaN(double num) 如果num指定了一個(gè)非數字值,則返回true。否則,返回false 
static double longBitsToDouble(long num) 返回由num指定的,與IEEE兼容的雙精度位模式的雙精度(double)等價(jià)值 
long longValue() 返回調用對象的值(長(cháng)整型) 
static double parseDouble(String str)   throws NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)雙精度(double)形式(在Java 2中新增加的) 
short shortValue() 返回調用對象的值(短整型) 
String toString() 返回調用對象的等價(jià)字符串形式 
Static String toString(double num) 返回由num指定的值的等價(jià)字符串形式 
Static Double valueOf(String str)   throws NumberFormatException 返回包含了由str中的字符串指定的值的double對象 
在下面的例子中創(chuàng )建兩個(gè)double對象--一個(gè)通過(guò)使用雙精度(double)值實(shí)現,另一個(gè)通過(guò)傳遞一個(gè)可以被解析為雙精度(double)的字符串來(lái)實(shí)現。
class DoubleDemo {
  public static void main(String args[]) {
    Double d1 = new Double(3.14159);
    Double d2 = new Double("314159E-5");

    System.out.println(d1 + " = " + d2 + " -> " + d1.equals(d2));
  }
}
正如從下面的輸出中可以看到的那樣,如同通過(guò)equals( )方法返回true,兩種構造函數創(chuàng )建相同的雙精度(double)實(shí)例。
3.14159 = 3.14159 -> true
理解isInfinite( )和isNaN( )
浮點(diǎn)(Float)和雙精度(Double)提供了isInfinite( )和isNaN( )方法,這些方法會(huì )有助于操作兩個(gè)特殊的雙精度(double)和浮點(diǎn)(float)值,這些方法檢驗兩個(gè)由IEEE浮點(diǎn)規范定義的獨特的值:無(wú)窮和NaN(非具體數字)。當被檢驗的值為無(wú)窮大或無(wú)窮小值時(shí),isInfinite( )方法返回true。當被檢驗值為非數字時(shí),isNaN( )方法返回true。
在下面的例子中構造了兩個(gè)Double對象;一個(gè)是無(wú)窮,另一個(gè)是非數字:
// Demonstrate isInfinite() and isNaN()
class InfNaN {
  public static void main(String args[]) {
    Double d1 = new Double(1/0.);
    Double d2 = new Double(0/0.);

    System.out.println(d1 + ": " + d1.isInfinite() + ", " + d1.isNaN());
    System.out.println(d2 + ": " + d2.isInfinite() + ", " + d2.isNaN());
  }
}
程序運行產(chǎn)生如下的輸出:
Infinity: true, false
NaN: false, true
  1. 1.3、 ByteShortInteger 和 Long

Byte,Short,Integer,和Long類(lèi)分別是字節型(byte),短整型(short),整型(int)和長(cháng)整型(long)整數類(lèi)型的包裝器。它們的構造函數如下:
Byte(byte num)
Byte(String str) 引發(fā)一個(gè)NumberFormatException異常  
Short(short num)
Short(String str) 引發(fā)一個(gè)NumberFormatException異常  
Integer(int num)
Integer(String str) 引發(fā)一個(gè)NumberFormatException異常 
Long(long num)
Long(String str) 引發(fā)一個(gè)NumberFormatException異常  
正如你能看到的,這些對象可由數值或含有有效整數值的字符串創(chuàng )建。
由這些類(lèi)定義的方法列在表14-3到表14-6中。正如你能看到的,它們定義方法以便從字符串解析整數和將字符串轉換為整數。為方便起見(jiàn),這些方法提供的變量可以用來(lái)指定radix,也稱(chēng)為基數。通常二進(jìn)制(binary)的基數是2,八進(jìn)制(octal)的基數是8,十進(jìn)制(decimal)的基數是10,而十六進(jìn)制(hexadecimal)的基數為16。
表3  由Byte定義的方法
方法 描述 
byte byteValue() 返回調用對象值(字節型) 
int compareTo(Byte b) 將調用對象的數值與b的數值進(jìn)行比較。如果這兩個(gè)數值相等,則返回0。如果調用對象的數值小于b的數值,則返回負值。如果調用對象的數值大于b的數值,則返回正值(在Java 2中新增加的) 
int compareTo(Object obj) 如果obj屬于類(lèi)Byte,其操作與compareTo(Byte)相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
static Byte decode(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定的值的Byte對象 
double doubleValue() 返回調用對象值(雙精度度型) 
boolean equals(Object ByteObj) 如果Byte調用對象與ByteObj相等,則返回true。否則,返回false 
float floatValue() 返回調用對象值(浮點(diǎn)型) 
int hashCode() 返回調用對象的散列碼 
int intValue() 返回調用對象值(整型) 
long longValue() 返回調用對象值(長(cháng)整型) 
static byte parseByte(String str)   throws NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)字節(byte)形式 
static byte parseByte(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回包含在由str指定的字符串中的數字的等價(jià)字節 
short shortValue() 返回調用對象值(短整型) 
String toString() 返回一個(gè)包含了調用對象的等價(jià)十進(jìn)制形式的字符串 
static String toString(byte num) 返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static Byte valueOf(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定的值的Byte對象 
static Byte valueOf(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回一個(gè)包含了由str中的字符串指定的值的Byte對象 
表4  由Short定義的方法
方法 描述 
byte byteValue() 返回調用對象值(字節型) 
int compareTo(Short s) 將調用對象的數值和s的數值進(jìn)行比較。如果這兩個(gè)值相等,則返回0。如果調用對象的數值小于s的數值,則返回負值 如果調用對象的數值大于s的數值,則返回正值(在Java 2中新增加的) 
int compareTo(Object obj) 如果obj屬于類(lèi)Short,其操作與compareTo(Short)相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
static Short decode(String str) throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定值的Short對象 
double doubleValue() 返回調用對象值(雙精度型) 
boolean equals(Object ShortObj) 如果整型(Interger)調用對象與ShortObj相等,則返回true。否則,返回false 
float floatValue() 返回調用對象值(浮點(diǎn)值) 
int hashCode() 返回調用對象的散列碼 
int intValue() 返回調用對象值(整型) 
long longValue() 返回調用對象值(長(cháng)整型) 
static short parseShort(String str)  throws   NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)短整型(Short)數 
static short parseShort(String str,int radix)  throws NumberFormatException 以指定的基數(radix)為底,返回包含在由str指定的字符串中的數字的等價(jià)短整型(Short)數 
short shortValue() 返回調用對象值(短整型) 
String toString() 返回一個(gè)包含了調用對象的等價(jià)十進(jìn)制形式的字符串 
static String to String(short num) 返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static Shortvalue Of(Stringstr)throws   NumberFormatException 以10為基數,返回一個(gè)包含了由str中的字符串指定的值的Short對象 
static Short valueOf(String str,int radix) throws  NumberFormatException 以指定的基數(radix)為底,返回一個(gè)包含了由str中的字符串指定的值的Short對象 
表5  由Integer定義的方法
方法 描述 
byte byteValue() 返回調用對象值(字節型) 
int compareTo(Integer i) 將調用對象的數值與i的數值進(jìn)行比較。如果這兩個(gè)值相等,則返回0。如果調用對象的數值小于i的數值,則返回負值。如果調用對象的數值大于i的數值,則返回正值(在Java 2中新增加的) 
int compareTo(Object obj) 如果obj屬于類(lèi)Integer,其操作與compareTo(Integer)相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
static Integer decode(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定值的Integer對象 
double doubleValue() 返回調用對象值(雙精度型) 
boolean equals(Object IntegerObj) 如果調用Interger對象與IntegerObj相等,則返回true。否則,返回false 
float floatValue()static Integer getInteger (String propertyName) 返回調用對象值(浮點(diǎn)型) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗返回null 
static Integer getInteger (String propertyName,int default) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗返回default值 
static Integer getInteger (String propertyName,Integer default) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗返回default值 
int hashCode() 返回調用對象的散列碼 
int intValue() 返回調用對象值(整型) 
long longValue() 返回調用對象值(長(cháng)整型) 
static int parseInt(String str)   throws NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)整數(integer)值 
static int parseInt(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回包含在由str指定的字符串中的數字的等價(jià)整數值 
short shortValue() 返回調用對象值(短整型) 
static String toBinaryString(int num) 返回一個(gè)包含了num的等價(jià)二進(jìn)制形式的字符串 
static String toHexString(int num) 返回一個(gè)包含了num的等價(jià)十六進(jìn)制形式的字符串 
static String toOctalString(int num) 返回一個(gè)包含了num的等價(jià)八進(jìn)制形式的字符串 
String toString() 返回一個(gè)包含了調用對象的等價(jià)十進(jìn)制形式的字符串 
static String toString(int num) 返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static String toString(int num,int radix) 以指定的基數(radix)為底,返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static Integer valueOf(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定的值的Integer對象 
static Integer valueOf(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回一個(gè)包含了由str中的字符串指定的值的Integer對象 

表6  由Long定義的方法
方法 描述 
byte byteValue() 返回調用對象值(字節型) 
int compareTo(Long l) 將調用對象的數值和l的數值進(jìn)行比較,如果這兩個(gè)值相等,則返回0。如果調用對象的數值小于l的數值,則返回負值。如果調用對象的數值大于l的數值,則返回正值(在Java 2中新增加的) 
int compareTo(Object obj) 如果obj屬于類(lèi)long,其操作與compareTo(Long)相同。否則,引發(fā)一個(gè)ClassCastException異常(在Java 2中新增加的) 
static Long decode(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定的值的Long對象 
double doubleValue() 返回調用對象值(雙精度型) 
boolean equals(Object LongObj) 如果調用Long對象與LongObj相等,則返回true。否則,返回false 
float floatValue() 返回調用對象值(浮點(diǎn)型) 
static Long getLong(String propertyname) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗則返回null 
static Long getLong(String propertyname, long default) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗則返回default的值 
static long getLong(String propertyname, Long default) 返回與由propertyname指定的環(huán)境屬性相關(guān)聯(lián)的值,調用失敗則返回default的值 
int hashcode() 返回調用對象的散列碼 
int intValue() 返回調用對象值(整型) 
long longValue() 返回調用對象值(長(cháng)整型) 
static long parseLong(String str)   throws NumberFormatException 以10為基數,返回包含在由str指定的字符串中的數字的等價(jià)長(cháng)整型(Long)數 
static long parseLong(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回包含在由str指定的字符串中的數字的等價(jià)長(cháng)整型(Long)數 
short shortValue() 返回調用對象值(短整型) 
static String toBinaryString(long num) 返回一個(gè)包含了num的等價(jià)二進(jìn)制形式的字符串 
static String toHexString(long num) 返回一個(gè)包含了num的等價(jià)十六進(jìn)制形式的字符串 
static String toOctalString(long num) 返回一個(gè)包含了num的等價(jià)八進(jìn)制形式的字符串 
String toString() 返回一個(gè)包含了調用對象的等價(jià)十進(jìn)制形式的字符串 
static String toString(long num) 返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static String toString(long num,int radix) 以指定的基數(radix)為底,返回一個(gè)包含了num的等價(jià)十進(jìn)制形式的字符串 
static Long valueOf(String str)   throws NumberFormatException 返回一個(gè)包含了由str中的字符串指定的值的Long對象 
static Long valueOf(String str,int radix)   throws NumberFormatException 以指定的基數(radix)為底,返回一個(gè)包含了由str中的字符串指定的值的Long對象 
定義下面的常數:
MIN_VALUE 最小值 
MAX_VALUE 最大值 
TYPE 字節(Byte),短整型(short),整型(int)或長(cháng)整型(long)的類(lèi)(Class)對象 
數字和字符串的轉換
程序設計中一個(gè)最常見(jiàn)的任務(wù)是將一個(gè)數字的字符串表達式轉換成內部的二進(jìn)制格式。幸運的是Java提供了一個(gè)方便的方法去完成這項任務(wù)。Byte,Short,Integer和Long類(lèi)分別提供了parseByte( ),parseShort( ),parseInt( )和parseLong( )方法。這些方法返回與調用它們的數值字符串相應的字節(byte),短整型(short),整型(int)和長(cháng)整型(long)值(在Float和Double類(lèi)中也有相似的方法)。
下面的程序說(shuō)明了parseInt( )方法。該程序完成對用戶(hù)輸入的一系列整數的求和。在程序中通過(guò)使用readLine( )方法讀取整數,使用parseInt( )方法將這些字符串轉換成與之相應的整型(int)值。
/* This program sums a list of numbers entered
   by the user.  It converts the string representation
   of each number into an int using parseInt().
*/

import java.io.*;

class ParseDemo {
  public static void main(String args[]) 
    throws IOException
  {
    // create a BufferedReader using System.in
    BufferedReader br = new
      BufferedReader(new InputStreamReader(System.in));
    String str;
    int i;
    int sum=0;
    
    System.out.println("Enter numbers, 0 to quit.");
    do {
      str = br.readLine();
      try {
        i = Integer.parseInt(str);
      } catch(NumberFormatException e) {
        System.out.println("Invalid format");
        i = 0;
      }
      sum += i;
      System.out.println("Current sum is: " + sum);
    } while(i != 0);
  }
}
為了將一個(gè)整數轉換為一個(gè)十進(jìn)制的字符串,可以使用在Byte,Short,Integer或Long類(lèi)中定義的toString( )方法。Integer和Long類(lèi)還同時(shí)提供了toBinaryString( ),toHexString( )和toOctalString( )方法,可以分別將一個(gè)值轉換成二進(jìn)制,十六進(jìn)制和八進(jìn)制字符串。
下面的程序說(shuō)明了向二進(jìn)制,十六進(jìn)制和八進(jìn)制的轉換:
/* Convert an integer into binary, hexadecimal,
   and octal.
*/
class StringConversions {
  public static void main(String args[]) {
    int num = 19648;

    System.out.println(num + " in binary: " +
                       Integer.toBinaryString(num));

    System.out.println(num + " in octal: " +
                       Integer.toOctalString(num));

    System.out.println(num + " in hexadecimal: " +
                       Integer.toHexString(num));
  }
}
程序的輸出結果如下所示:
19648 in binary: 100110011000000
19648 in octal: 46300
19648 in hexadecimal: 4cc0
  1. 1.4、 Character

字符(Character)是圍繞字符型(char)的一個(gè)簡(jiǎn)單的包裝器。字符(Character)的構造函數如下:
Character(char ch)
這里ch指定了被創(chuàng )建的字符(Character)對象所包裝的字符。
調用如下的charValue( )方法可以獲得包含在字符(Character)對象中的字符型(char)值。
char charValue( )
調用的結果返回字符。
字符(Character)類(lèi)定義了幾個(gè)常數,包括下面這些:
MAX_RADIX 最大基數 
MIN_RADIX 最小基數 
MAX_VALUE 最大字符值 
MIN_VALUE 最小字符值 
TYPE 字符型(char)的類(lèi)(Class)對象 
字符(Character)包括了幾個(gè)靜態(tài)方法,這些方法完成將字符分類(lèi)并改變它們的大小寫(xiě)。這些方法在表7中列出。下面的例子說(shuō)明了這些方法。
// Demonstrate several Is... methods.

class IsDemo {
  public static void main(String args[]) {
    char a[] = {‘a(chǎn)‘, ‘b‘, ‘5‘, ‘?‘, ‘A‘, ‘ ‘};

    for(int i=0; i<a.length; i++) {
      if(Character.isDigit(a[i]))
        System.out.println(a[i] + " is a digit.");
      if(Character.isLetter(a[i]))
        System.out.println(a[i] + " is a letter.");
      if(Character.isWhitespace(a[i]))
        System.out.println(a[i] + " is whitespace.");
      if(Character.isUpperCase(a[i]))
        System.out.println(a[i] + " is uppercase.");
      if(Character.isLowerCase(a[i]))
        System.out.println(a[i] + " is lowercase.");
    }
  }
}
程序的輸出結果如下所示:
a is a letter.
a is lowercase.
b is a letter.
b is lowercase.
5 is a digit.
A is a letter.
A is uppercase.
  is whitespace.
表7  各種字符(Character)方法
方法 描述 
static boolean isDefined(char ch) 如果ch是由Unicode定義的,則返回true,否則,返回false 
static boolean isDigit(char ch) 如果ch是一個(gè)數字,則返回true,否則,返回false 
static boolean isIdentifierIgnorable(char ch) 如果在一個(gè)標識符中ch應被忽略,則返回true,否則,返回false 
static boolean isISOControl(char ch) 如果ch是一個(gè)ISO控制字符,則返回true,否則,返回false 
static boolean isJavaIdentifierPart(char ch) 如果ch被做為Java標識符的一部分(除了第一個(gè)字符),則返回true。否則,返回false 
static boolean isJavaIdentifierStart(char ch) 如果ch被做為Java標識符的首字符,則返回true。否則返回false 
static boolean isLetter(char ch) 如果ch是一個(gè)字母,則返回true。否則返回false 
static boolean isLetterOrDigit(char ch) 如果ch是一個(gè)字母或一個(gè)數字,則返回true。否則返回false 
static boolean isLowerCase(char ch) 當ch是小寫(xiě)字母時(shí),返回true。否則返回false 
static boolean isSpaceChar(char ch) 如果ch是Unicode編碼的空格字符,則返回true。否則返回false 
static boolean isTitleCase(char ch) 如果ch是Unicode編碼的標題字符,則返回true。否則返回false 
static boolean isUnicodeIdentifierPart (char ch) 如果ch被做為Unicode編碼標識符的一部分(除了第一個(gè)字符),則返回true。否則,返回false 
static boolean isUnicodeIdentifierStart (char ch) 如果ch被做為一個(gè)Unicode標識符的首字符,則返回true。否則返回false 
static boolean isUpperCase(char ch) 如果ch是一個(gè)大寫(xiě)字母,則返回true。否則返回false 
static boolean isWhitespace(char ch) 如果ch是一個(gè)空白符,則返回true。否則,返回false 
static char toLowerCase(char ch) 返回ch的小寫(xiě)等價(jià)形式 
static char toTitleCase(char ch) 返回ch的標題等價(jià)形式 
static char toUpperCase(char ch) 返回ch的大寫(xiě)等價(jià)形式 
字符(Character)定義了如下形式的forDigit( )和digit( )方法:
static char forDigit(int num, int radix)
static int digit(char digit, int radix)
forDigit( )方法返回與num的值關(guān)聯(lián)的數字字符。而轉換的基數由radix指定。digit( )方法按照給定的基數,返回與指定字符(該字符可能是一個(gè)數字)相關(guān)聯(lián)的整數值。
由Character類(lèi)定義的另一個(gè)方法是compareTo( ),該方法具有如下的兩種形式:
int compareTo(Character c)
int compareTo(Object obj)
第一種形式當調用對象與c具有相同值時(shí)返回0。當調用對象具有比c小的值時(shí)返回一個(gè)負值。否則它將返回一個(gè)正值。在第二種形式中,當obj是對Character類(lèi)的一個(gè)引用時(shí),其功能與第一種形式一樣。否則它將引發(fā)一個(gè)ClassCastException異常。這些方法是在Java 2中新增加的。
Character類(lèi)還定義了equals( )和hashCode( )方法。
另兩個(gè)與字符有關(guān)的類(lèi)是Character.Subset和Character.UnicodeBlock,其中Character.Subset類(lèi)用于描述Unicode編碼的一個(gè)子集,而Character.UnicodeBlock類(lèi)中包含了Unicode 2.0編碼的字符塊。
  1. 1.5、  Boolean

Boolean是一個(gè)圍繞布爾(boolean)值的非常細小的包裝器,主要用在通過(guò)引用傳遞布爾(boolean)變量的場(chǎng)合。它包含了常數TRUE和FALSE,這些常數定義了布爾(Boolean)對象的真與假。Boolean也定義了TYPE域,它是boolean的Class對象。在Boolean中定義了如下的構造函數:
Boolean(boolean boolValue)
Boolean(String boolString)
在第一種形式中,boolValue要么是true,要么是false。在第二種形式中,如果在boolString中包含了字符串“true”(無(wú)論是大寫(xiě)形式還是小寫(xiě)形式),則新的布爾(Boolean)對象將為真,否則為假。
Boolean定義了如表14-8中列出的方法。
表8  由Boolean定義的方法
方法 描述 
boolean booleanValue( )  返回布爾(boolean)等價(jià)形式 
boolean equals(Object boolObj)  如果調用對象與boolObj相等,則返回true。否則返回false 
static boolean getBoolean(String propertyName) 如果由propertyName指定的系統屬性為true,則返回true。否則返回false 
int hashCode( ) 返回調用對象的散列碼 
String toString( ) 返回調用對象的字符串等價(jià)形式 
static Boolean valueOf(String boolString)  如果在boolString中包含了“true”(以大寫(xiě)或小寫(xiě)形式),則返回true。否則返回false 
  1. 2、 Void

Void類(lèi)有一個(gè)TYPE域,該域保存對類(lèi)型void的Class對象的引用。這樣做將不創(chuàng )建類(lèi)的實(shí)例。
  1. 3、Process

抽象類(lèi)Process封裝了一個(gè)進(jìn)程(process)--也就是說(shuō)一個(gè)正在執行的程序。它主要被當作由Runtime類(lèi)中的exec( )方法所創(chuàng )建的對象的類(lèi)型的超類(lèi)。Runtime類(lèi)將在下面介紹。在抽象類(lèi)Process中,包含了如下表14-9中列出的抽象方法。
表9  由Process定義的抽象方法
方法 描述 
void destroy( ) 中斷進(jìn)程 
int exitValue( ) 返回一個(gè)從子進(jìn)程獲得的退出碼 
InputStream getErrorStream( )  返回一個(gè)從進(jìn)程的err輸出流中讀輸入的輸入流 
InputStream getInputStream( ) 返回一個(gè)從進(jìn)程的out輸出流中讀輸入的輸入流 
OutputStream getOutputStream( ) 返回一個(gè)從進(jìn)程的in輸入流中寫(xiě)輸出的輸出流 
Int waitFor( )   throws InterruptedException 返回由進(jìn)程返回的退出碼。這個(gè)方法直到調用它的進(jìn)程中止,才會(huì )返回 
  1. 4、  Runtime

Runtime類(lèi)封裝了運行時(shí)環(huán)境。一般不實(shí)例化一個(gè)Runtime對象。但是可以通過(guò)調用靜態(tài)方法Runtime.getRuntime( )而獲得對當前Runtime對象的引用。一旦獲得了對當前對象的引用,就可以調用幾個(gè)控制Java虛擬機的狀態(tài)和行為的方法。小應用程序(Applets)和其他不可信賴(lài)的編碼由于沒(méi)有引起一個(gè)安全異常(SecurityException)而不能調用任何的Runtime方法。
表10給出了由Runtime定義的方法。Java 2中不贊成使用方法runFinalizersonExit( )。這種方法是在Java 1.1中增加的,但被認為是一種不穩定的方法。
表10  由Runtime定義的常用方法
方法 描述 
void addShutdownHook(Thread thrd) 當Java虛擬機終止時(shí),寄存器thrd作為線(xiàn)程而運行 
Process exec(String progName)   throws IOException 將由progName指定的程序作為獨立的進(jìn)程來(lái)執行。返回描述新進(jìn)程的類(lèi)型Process的對象 
Process exec(String progName, String  environment[ ])  throws IOException 將由progName指定的程序作為獨立的進(jìn)程來(lái)執行。該獨立進(jìn)程的環(huán)境由environment指定。返回描述新進(jìn)程的類(lèi)型Process的對象 
Process exec(String comLineArray[ ],  String environment[ ])  throws   IOException 將由comLineArray中的字符串指定的命令行作為獨立的進(jìn)程來(lái)執行。運行環(huán)境由environment指定。返回描述新進(jìn)程的類(lèi)型Process的對象 
void exit(int exitCode)  暫停執行并且向父進(jìn)程返回exitCode的值,按照約定,0表示正常中止,所有的其他值表示有某種形式的錯誤 
long freeMemory( )  返回Java運行系統可以利用的空閑內存的大概字節數 
void gc( )  初始化垃圾回收站 
static Runtime getRuntime( )  返回當前的Runtime對象
void halt(int code)  立即終止Java虛擬機,不執行任何的終止線(xiàn)程和善后處理程序。code的值返回給調用進(jìn)程(在Java 2的1.3版中新增加的) 
void load(String libraryFileName)  載入庫中文件由libraryFileName指定的動(dòng)態(tài)庫,必須指定它的完全路徑 
void loadLibrary(String libraryName)  載入庫名為libraryName的動(dòng)態(tài)庫 
boolean removeShutdownHook(Thread thrd)  當Java虛擬機中止,從線(xiàn)程列表中移出thrd的運行。如果成功,也就是說(shuō)如果線(xiàn)程被移出,則返回true(在Java 2的1.3版中新增加的) 
void runFinalization( )  調用未用的但還不是回收站中對象的finalize()方法 
long totalMemory( )  返回程序可以利用的內存的總字節數 
void traceInstructions(boolean traceOn)  根據traceOn的值,打開(kāi)或關(guān)閉指令跟蹤。如果traceOn值為true,跟蹤被顯示。如果traceOn值為false,跟蹤被關(guān)閉 
void traceMethodCalls(boolean traceOn)  根據traceOn的值,打開(kāi)或關(guān)閉調用跟蹤的方法。如果traceOn的值為true,跟蹤被顯示。如果traceOn的值為false,跟蹤被關(guān)閉 
讓我們來(lái)看一看Runtime類(lèi)的兩個(gè)最普遍的用法:內存管理和執行附加進(jìn)程。
  1. 4.1  內存管理

盡管Java提供了自動(dòng)垃圾回收,有時(shí)也想知道對象堆的大小以及它還剩下多少??梢岳眠@些信息檢驗你的代碼的效率,或估計對某些類(lèi)型,有多少對象可以被實(shí)例化。為了獲得這些值,可以使用totalMemory( )和freeMemory( )方法。
正如我們在第1部分提及的,Java的垃圾回收器周期性地運行將不再使用的對象放入回收站。然而有時(shí)想在收集器的下一個(gè)指定循環(huán)之前收集被丟棄的對象??梢酝ㄟ^(guò)調用gc( )方法按照要求運行垃圾回收器。一個(gè)好的嘗試是調用gc( )方法,然后再調用freeMemory( )方法以獲得內存使用的底線(xiàn)。接著(zhù)執行你的程序,并再一次調用freeMemory( )方法看分配了多少內存。下面的例子說(shuō)明了這個(gè)思想。
// Demonstrate totalMemory(), freeMemory() and gc().

class MemoryDemo {
  public static void main(String args[]) {
    Runtime r = Runtime.getRuntime();
    long mem1, mem2;
    Integer someints[] = new Integer[1000];

    System.out.println("Total memory is: " +
                       r.totalMemory());

    mem1 = r.freeMemory();
    System.out.println("Initial free memory: " + mem1);
    r.gc();
    mem1 = r.freeMemory();
    System.out.println("Free memory after garbage collection: "
                       + mem1);

    for(int i=0; i<1000; i++)
      someints[i] = new Integer(i); // allocate integers

    mem2 = r.freeMemory();
    System.out.println("Free memory after allocation: "
                       + mem2);
    System.out.println("Memory used by allocation: "
                       + (mem1-mem2));

    // discard Integers
    for(int i=0; i<1000; i++) someints[i] = null;

    r.gc(); // request garbage collection

    mem2 = r.freeMemory();
    System.out.println("Free memory after collecting" +
                       " discarded Integers: " + mem2);

  }
}
這個(gè)例子的一個(gè)輸出樣本如下(當然,你的實(shí)際運行結果可能會(huì )與之不同):
Total memory is: 1048568
Initial free memory: 751392
Free memory after garbage collection: 841424
Free memory after allocation: 824000
Memory used by allocation: 17424
Free memory after collecting discarded Integers: 842640
  1. 4.2、  執行其他的程序


在可靠的環(huán)境中,可以在你的多任務(wù)操作系統中使用Java去執行其他特別繁重的進(jìn)程(也即程序)。exec( )方法的幾種形式允許命名想運行的程序以及它們的輸入參數。exec( )方法返回一個(gè)Process對象,這個(gè)對象可以被用來(lái)控制你的Java程序如何與這個(gè)正在運行的新進(jìn)程相互作用。因為Java可以運行在多種平臺和多種操作系統的情況下,exec( )方法本質(zhì)上是依賴(lài)于環(huán)境的。
下面的例子使用exec( )方法裝入Window的簡(jiǎn)單文本編輯器--notepad。顯而易見(jiàn),這個(gè)例子必須在Windows操作系統下運行。
// Demonstrate exec().
class ExecDemo {
  public static void main(String args[]) {
    Runtime r = Runtime.getRuntime();
    Process p = null;

    try {
      p = r.exec("notepad");
    } catch (Exception e) {
      System.out.println("Error executing notepad.");
    }
  }
}
exec( )方法有幾個(gè)形式可用,而在本例子中展示的是最常用的一種。在新程序開(kāi)始運行之后,由exec( )方法返回的Process對象可以被Process方法使用??梢允褂胐estroy( )方法殺死子進(jìn)程。waitFor( )方法暫停你的程序直至子進(jìn)程結束。當子進(jìn)程結束后,exitValue( )方法返回子進(jìn)程返回的值。如果沒(méi)有問(wèn)題發(fā)生,它通常返回0。下面是前面關(guān)于exec( )方法例子的改進(jìn)版本。例子被修改為等待直至正在運行的進(jìn)程退出:
// Wait until notepad is terminated.
class ExecDemoFini {
  public static void main(String args[]) {
    Runtime r = Runtime.getRuntime();
    Process p = null;

    try {
      p = r.exec("notepad");
      p.waitFor();
    } catch (Exception e) {
      System.out.println("Error executing notepad.");
    }
    System.out.println("Notepad returned " + p.exitValue());
  }
}
當子進(jìn)程正在運行時(shí),可以從它的標準輸入輸出進(jìn)行讀和寫(xiě)。getOutputStream( )方法和getInputStream( )方法返回子進(jìn)程的標準輸入(in)和輸出(out)的句柄。

  1. 5、  System


System類(lèi)保存靜態(tài)方法和變量的集合。標準的輸入,輸出和Java運行時(shí)錯誤輸出存儲在變量in,out和err中。由System類(lèi)定義的方法列在表14-11中。注意當所做操作是安全方式所不允許的時(shí),許多方法引發(fā)一個(gè)安全異常(SecurityException)。應當注意的另一點(diǎn)是:Java 2不贊成使用runFinalizersonExit( )方法。該方法是在Java 1.1中增加的,同時(shí)也被證明是不可靠的。
讓我們看一看System類(lèi)的一些普遍用法。
表11  由Sysem定義的方法
方法 描述 
static void arraycopy(Object source, int   sourceStart, Object target, int targetStart,   int size) 復制數組。被復制的數組由source傳遞,而source中開(kāi)始復制數組時(shí)的下標由sourceStart傳遞。接收復制的數組由target傳遞。而target中開(kāi)始復制數組時(shí)的下標由targetStart傳遞。Size是被復制的元素的個(gè)數 
static long currentTimeMillis( )  返回自1970年1月1日午夜至今的時(shí)間,時(shí)間單位為毫秒。 
static void exit(int exitCode)  暫停執行,返回exitCode值給父進(jìn)程(通常為操作系統)。按照約定,0表示正常退出,所有其他的值代表某種形式的錯誤 
static void gc( )  初始化垃圾回收 
static Properties getProperties( )  返回與Java運行系統有關(guān)的屬性類(lèi)(Properties class)將在第15章中介紹) 
static String getProperty(String which)  返回與which有關(guān)的屬性。如果期望的屬性沒(méi)有被發(fā)現,返回一個(gè)空對象(null object) 
static String getProperty(String which,   String default) 返回一個(gè)與which有關(guān)的屬性。如果期望的屬性沒(méi)有被發(fā)現,則返回default 
static SecurityManager getSecurityManager( )  返回當前的安全管理程序,如果沒(méi)有安裝安全管理程序,則返回一個(gè)空對象(null object) 
static native int identityHashCode(Object obj)  返回obj的特征散列碼 
static void load(String libraryFileName)  載入其文件由libraryFileName指定的動(dòng)態(tài)庫,必須指定其完全路徑 
static void loadLibrary(String libraryName)  載入其庫名為libraryName的動(dòng)態(tài)庫 
static String mapLibraryName(String lib)  對應名為lib的庫,返回一個(gè)指定平臺的名字(在Java 2中新增加的) 
static void runFinalization( )  啟動(dòng)調用不用的但還不是回收站中的對象的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指定的安全管理程序 

  1. 5.1、  使用currentTimeMillis( )記錄程序執行的時(shí)間


可以發(fā)現System類(lèi)的一個(gè)特別有意義的用法是利用currentTimeMillis( )方法來(lái)記錄你的程序的不同部分的執行時(shí)間。currentTimeMillis( )方法返回自從1970年1月1號午夜起到現在的時(shí)間,時(shí)間單位是毫秒。如果要記錄你的程序中一段有問(wèn)題程序的運行時(shí)間可以在這段程序開(kāi)始之前存儲當前時(shí)間,在該段程序結束之際再次調用currentTimeMillis( )方法。執行該段程序所花費的時(shí)間為其結束時(shí)刻的時(shí)間值減去其開(kāi)始時(shí)刻的時(shí)間值。下面的程序說(shuō)明了這一點(diǎn):
// 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 < 1000000; i++) ;
    end = System.currentTimeMillis(); // get ending time

    System.out.println("Elapsed time: " + (end-start));
  }
}
這里是程序運行的一個(gè)輸出樣本(記住你的程序的運行結果可能與此不同):
Timing a for loop from 0 to 1,000,000
Elapsed time: 10

  1. 5.2、  使用arraycopy( )


使用arraycopy( )方法可以將一個(gè)任意類(lèi)型的數組快速地從一個(gè)地方復制到另一個(gè)地方。這比使用Java中編寫(xiě)的循環(huán)要快的多。下面是一個(gè)用arraycopy( )方法復制兩個(gè)數組的例子。首先,將數組a復制給數組b,接下來(lái),數組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));
  }
}
正如從下面的輸出中看到的那樣,可以使用相同的源和目的在任一方向進(jìn)行復制:
a = ABCDEFGHIJ
b = MMMMMMMMMM
a = ABCDEFGHIJ
b = ABCDEFGHIJ
a = AABCDEFGHI
b = BCDEFGHIJJ

  1. 5.3 、 環(huán)境屬性


下面的屬性在Java 2的所有環(huán)境中可以使用:
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  
可以通過(guò)調用System.getProperty( )方法來(lái)獲得不同環(huán)境變量的值。例如下面的程序顯示當前用戶(hù)目錄的路徑:
class ShowUserDir {
  public static void main(String args[]) {
    System.out.println(System.getProperty("user.dir"));
  }
}

  1. 6、  Object


正如我們在第1部分所提及的,Object類(lèi)是其他所有類(lèi)的一個(gè)超類(lèi)。表14-12給出了Object類(lèi)中定義的方法,這些方法對于每一個(gè)對象都是可用的。

表12  由Object定義的方法
方法 描述 
Object clone( )   Throws      CloneNotSupportedException 創(chuàng )建一個(gè)與調用對象一樣的新對象 
Boolean equals(Object object) 如果調用對象等價(jià)于object返回true 
void finalize( )   throws Throwable 默認的finalize( )方法。常常被子類(lèi)重載 
final Class getClass( )  獲得描述調用對象的Class對象 
int hashCode( )  返回與調用對象關(guān)聯(lián)的散列碼 
final void notify( )  恢復等待調用對象的線(xiàn)程的執行 
final void notifyAll( )  恢復等待調用對象的所有線(xiàn)程的執行 
String toString( )  返回描述對象的一個(gè)字符串 
final void wait( )   throws InterruptedException 等待另一個(gè)執行的線(xiàn)程 
final void wait(long milliseconds)   throws InterruptedException 等待直至指定毫秒數的另一個(gè)執行的線(xiàn)程 
final void wait(long milliseconds,              int nanoseconds)   throws InterruptedException 等待直至指定毫秒加毫微秒數的另一個(gè)執行的線(xiàn)程 

  1. 7、  使用clone( )和Cloneable接口


由Object類(lèi)定義的絕大部分方法在本書(shū)其他部分討論。而一個(gè)特別值得關(guān)注的方法是clone( )。clone( )方法創(chuàng )建調用它的對象的一個(gè)復制副本。只有那些實(shí)現Cloneable接口的類(lèi)能被復制。
Cloneable接口沒(méi)有定義成員。它通常用于指明被創(chuàng )建的一個(gè)允許對對象進(jìn)行位復制(也就是對象副本)的類(lèi)。如果試圖用一個(gè)不支持Cloneable接口的類(lèi)調用clone( )方法,將引發(fā)一個(gè)CloneNotSupportedException異常。當一個(gè)副本被創(chuàng )建時(shí),并沒(méi)有調用被復制對象的構造函數。副本僅僅是原對象的一個(gè)簡(jiǎn)單精確的拷貝。
復制是一個(gè)具有潛在危險的操作,因為它可能引起不是你所期望的副作用。例如,假如被復制的對象包含了一個(gè)稱(chēng)為obRef的引用變量,當副本創(chuàng )建時(shí),副本中的obRef如同原對象中的obRef一樣引用相同的對象。如果副本改變了被obRef引用的對象的內容,那么對應的原對象也將被改變。這里是另一個(gè)例子。如果一個(gè)對象打開(kāi)一個(gè)I/O流并被復制,兩個(gè)對象將可操作相同的流。而且,如果其中一個(gè)對象關(guān)閉了流,而另一個(gè)對象仍試圖對I/O流進(jìn)行寫(xiě)操作的話(huà),將導致錯誤。
由于復制可能引起問(wèn)題,因此在Object內,clone( )方法被說(shuō)明為protected。這就意味著(zhù)它必須或者被由實(shí)現Cloneable的類(lèi)所定義的方法調用,或者必須被那些類(lèi)顯式重載以便它是公共的。讓我們看關(guān)于下面每一種方法的例子。
下面的程序實(shí)現Cloneable接口并定義cloneTest( )方法,該方法在Object中調用clone( )方法:
// Demonstrate the clone() method.

class TestClone implements Cloneable {
  int a;
  double b;

  // This method calls Object‘s clone().
  TestClone cloneTest() {
    try {
      // call clone in Object.
      return (TestClone) super.clone();
    } catch(CloneNotSupportedException e) {
      System.out.println("Cloning not allowed.");
      return this;
    }
  }
}

class CloneDemo {
  public static void main(String args[]) {
    TestClone x1 = new TestClone();
    TestClone x2;

    x1.a = 10;
    x1.b = 20.98;

    x2 = x1.cloneTest(); // clone x1

    System.out.println("x1: " + x1.a + " " + x1.b);
    System.out.println("x2: " + x2.a + " " + x2.b);
  }
}
這里,方法cloneTest( )在Object中調用clone( )方法并且返回結果。注意由clone( )方法返回的對象必須被強制轉換成它的適當類(lèi)型(TestClone)。
下面的例子重載clone( )方法以便它能被其類(lèi)外的程序所調用。為了完成這項功能,它的存取說(shuō)明符必須是public,如下所示:
// Override the clone() method.

class TestClone implements Cloneable {
  int a;
  double b;

  // clone() is now overridden and is public.
  public Object clone() {
    try {
      // call clone in Object.
      return super.clone();
    } catch(CloneNotSupportedException e) {
      System.out.println("Cloning not allowed.");
      return this;
    }
  }
}

class CloneDemo2 {
  public static void main(String args[]) {
    TestClone x1 = new TestClone();
    TestClone x2;

    x1.a = 10;
    x1.b = 20.98;

    // here, clone() is called directly.
    x2 = (TestClone) x1.clone(); 

    System.out.println("x1: " + x1.a + " " + x1.b);
    System.out.println("x2: " + x2.a + " " + x2.b);
  }
}
由復制帶來(lái)的副作用最初一般是比較難發(fā)現的。通常很容易想到的是類(lèi)在復制時(shí)是很安全的,而實(shí)際卻不是這樣。一般在沒(méi)有一個(gè)必須的原因的情況下,對任何類(lèi)都不應該執行Cloneable。

  1. 8、  Class


Class封裝對象或接口運行時(shí)的狀態(tài)。當類(lèi)被加載時(shí),類(lèi)型Class的對象被自動(dòng)創(chuàng )建。不能顯式說(shuō)明一個(gè)類(lèi)(Class)對象。一般地,通過(guò)調用由Object定義的getClass( )方法來(lái)獲得一個(gè)類(lèi)(Class)對象。由Class定義的一些最常用的方法列在表14-13中。
表13  由Class定義的一些方法
方法 描述 
static Class forName(String name)   throws ClassNotFoundException 返回一個(gè)給定全名的Class對象 
static Class forName(String name,   Boolean how, ClassLoader ldr)   throws ClassNotFoundException 返回一個(gè)給定全名的Calss對象。對象由ldr指定的加載程序加載。如果how為true,對象被初始化,否則它將不被初始化(在Java 2中新增加的) 
Class[ ] getClasses( )  對每一個(gè)公共類(lèi)和接口,返回一個(gè)類(lèi)(Class)對象。這些公共類(lèi)和接口是調用對象的成員 
ClassLoader getClassLoader( )  返回一個(gè)加載類(lèi)或接口的ClassLoader對象,類(lèi)或接口用于實(shí)例化調用對象 
Constructor[ ] getConstructors( )   throws SecurityException 對這個(gè)類(lèi)的所有的公共構造函數,返回一個(gè)Constructor對象 
Constructor[ ] getDeclaredConstructors( )   throws SecurityException 對由這個(gè)類(lèi)所聲明的所有構造函數,返回一個(gè)Constructor對象 
Field[ ] getDeclaredFields( )   throws SecurityException 對由這個(gè)類(lèi)所聲明的所有域,返回一個(gè)Field對象 
Method[ ] getDeclaredMethods( )   throws SecurityException 對由這個(gè)類(lèi)或接口所聲明的所有方法,返回一個(gè)Method對象 
Field[ ] getFields( )   throws SecurityException 對于這個(gè)類(lèi)的所有公共域,返回一個(gè)Field對象 
Class[ ] getInterfaces( )  當調用對象時(shí),這個(gè)方法返回一個(gè)由該對象的類(lèi)類(lèi)型實(shí)現的接口數組。當調用接口時(shí),這個(gè)方法返回一個(gè)由該接口擴展的接口數組 
Method[ ] getMethods( )   throws SecurityException 對這個(gè)類(lèi)中的所有公共方法,返回一個(gè)Method對象 
String getName( )  返回調用對象的類(lèi)或接口的全名 
ProtectionDomain getProtectionDomain( )  返回與調用對象有關(guān)的保護范圍(在Java 2中新增加的) 
Class getSuperclass( )  返回調用對象的超類(lèi)。如果調用對象是類(lèi)型Object的,則返回值為空(null) 
Boolean isInterface( )  如果調用對象是一個(gè)接口,則返回true。否則返回false 
Object newInstance( )   throws IllegalAccessException,         InstantiationException 創(chuàng )建一個(gè)與調用對象類(lèi)型相同的新的實(shí)例(即一個(gè)新對象)。這相當于對類(lèi)的默認構造函數使用new。返回新對象 
String toString( )  返回調用對象或接口的字符串表達式 
由Class定義的方法經(jīng)常用在需要知道對象的運行時(shí)類(lèi)型信息的場(chǎng)合。如同表14-13中所說(shuō)明的那樣,由Class提供的方法確定關(guān)于特定的類(lèi)的附加信息。例如它的公共構造函數,域以及方法。這對于本書(shū)后面將要討論的Java Beans函數是很重要的。
下面的程序說(shuō)明了getClass( )(從Object繼承的)和getSuperclass( )方法(從Class繼承的):
// Demonstrate Run-Time Type Information.
class X {
  int a;
  float b;
}

class Y extends X {
  double c;
}

class RTTI {
  public static void main(String args[]) {
    X x = new X();
    Y y = new Y();
    Class clObj;

    clObj = x.getClass(); // get Class reference
    System.out.println("x is object of type: " +
                       clObj.getName());

    clObj = y.getClass(); // get Class reference
    System.out.println("y is object of type: " +
                       clObj.getName());
    clObj = clObj.getSuperclass();
    System.out.println("y‘s superclass is " +
                       clObj.getName());
  }
}
這個(gè)程序的輸出如下所示:
x is object of type: X
y is object of type: Y
y’s superclass is X

  1. 9、  ClassLoader

抽象類(lèi)ClassLoader規定了類(lèi)是如何加載的。應用程序可以創(chuàng )建擴展ClassLoader的子類(lèi),實(shí)現它的方法。這樣做允許使用不同于通常由Java運行時(shí)系統加載的另一些方法來(lái)加載類(lèi)。由ClassLoader定義的一些方法列在表14-14中。
表14  由CalssLoader定義的一些方法
方法 描述 
final Class defineClass(String str, byte b[ ],   int index, int numBytes)   throws ClassFormatError 返回一個(gè)類(lèi)(Class)對象,類(lèi)的名字在str中,對象包含在由b指定的字節數組中。該數組中對象開(kāi)始的位置下標由index指定,而該數組的長(cháng)度為numBytes。b中的數據必須表示一個(gè)有效的對象 
final Class findSystemClass(String name)   throws ClassNotFoundException 返回一個(gè)給定名字的類(lèi)(Class)對象 
abstract Class loadClass(String name, boolean callResolveClass)   throws ClassNotFoundException 如果callResolveClass為true,這個(gè)抽象方法的實(shí)現工具必須加載一個(gè)給定名字的類(lèi),并調用resolveClass( )方法 
final void resolveClass(Class obj) 用obj引用的類(lèi)被解析(即,它的名字被輸入在類(lèi)名字空間中) 
 

  1. 10、  Math


Math類(lèi)保留了所有用于幾何學(xué),三角學(xué)以及幾種一般用途方法的浮點(diǎn)函數。Math定義了兩個(gè)雙精度(double)常數:E(近似為2.72)和PI(近似為3.14)。

  1. 10.1  超越函數


下面的三種方法對一個(gè)以弧度為單位的角度接收一個(gè)雙精度(double)參數并且返回它們各自的超越函數的結果:
方法 描述 
Static double sin(double arg) 返回由以弧度為單位由arg指定的角度的正弦值 
static double cos(double arg) 返回由以弧度為單位由arg指定的角度的余弦值 
static double tan(double arg) 返回由以弧度為單位由arg指定的角度的正切值 
下面的方法將超越函數的結果作為一個(gè)參數,按弧度返回產(chǎn)生這個(gè)結果的角度值。它們是其非弧度形式的反。
方法 描述 
static double asin(double arg) 返回一個(gè)角度,該角度的正弦值由arg指定 
static double acos(double arg) 返回一個(gè)角度,該角度的余弦值由arg指定 
static double atan(double arg) 返回一個(gè)角度,該角度的正切值由arg指定 
static double atan2(double x, double y) 返回一個(gè)角度,該角度的正切值為x/y 

  1. 10.2  指數函數

Math定義了下面的指數方法:
方法 描述 
static double exp(double arg) 返回arg的e 
static double log(double arg) 返回arg的自然對數值 
static double pow(double y, double x) 返回以y為底數,以x為指數的冪值;例如pow(2.0, 3.0)返回8.0 
static double sqrt(double arg) 返回arg的平方根 

  1. 10.3  舍入函數

Math類(lèi)定義了幾個(gè)提供不同類(lèi)型舍入運算的方法。這些方法列在表15中。

表15  由Math定義的舍入方法
方法 描述 
static int abs(int arg)  返回arg的絕對值 
static long abs(long arg)  返回arg的絕對值 
static float abs(float arg)  返回arg的絕對值 
static double abs(double arg) 返回arg的絕對值 
static double ceil(double arg)  返回大于或等于arg的最小整數 
static double floor(double arg)  返回小于或等于arg的最大整數 
static int max(int x, int y)  返回x和y中的最大值 
static long max(long x, long y)  返回x和y中的最大值 
static float max(float x, float y)  返回x和y中的最大值 
static double max(double x, double y)  返回x和y中的最大值 
static int min(int x, int y)  返回x和y中的最小值 
static long min(long x, long y)  返回x和y中的最小值 
static float min(float x, float y)  返回x和y中的最小值 
static double min(double x, double y)  返回x和y中的最小值 
static double rint(double arg)  返回最接近arg的整數值 
static int round(float arg)  返回arg的只入不舍的最近的整型(int)值 
static long round(double arg) 返回arg的只入不舍的最近的長(cháng)整型(long)值 

  1. 10.4  其他的數學(xué)方法


除了給出的方法,Math還定義了下面這些方法:
static double IEEEremainder(double dividend, double divisor)
static double random( )
static double toRadians(double angle)
static double toDegrees(double angle)
IEEEremainder( )方法返回dividend/divisor的余數。random( )方法返回一個(gè)偽隨機數,其值介于0與1之間。在大多數情況下,當需要產(chǎn)生隨機數時(shí),通常用Random類(lèi)。toRadians( )方法將角度的度轉換為弧度。而toDegrees( )方法將弧度轉換為度。這后兩種方法是在Java 2中新增加的。
下面是一個(gè)說(shuō)明toRadians( )和toDegrees( )方法的例子:
// Demonstrate toDegrees() and toRadians().
class Angles {
  public static void main(String args[]) {
    double theta = 120.0;

    System.out.println(theta + " degrees is " +
                       Math.toRadians(theta) + " radians.");

    theta = 1.312;
    System.out.println(theta + " radians is " +
                       Math.toDegrees(theta) + " degrees.");
  }
}
程序輸出如下所示:
120.0 degrees is 2.0943951023931953 radians.
1.312 radians is 75.17206272116401 degrees.

  1. 11、  StrictMath


在Java 2的1.3版本中增加了StrictMath類(lèi)。這個(gè)類(lèi)定義一個(gè)與Math中的數學(xué)方法類(lèi)似的一套完整的數學(xué)方法。兩者的區別在于StrictMath中的方法對所有Java工具保證產(chǎn)生精確一致的結果,而Math中的方法更大程度上是為了提高性能。

  1. 12 、 Compiler


Compiler類(lèi)支持創(chuàng )建將字節碼編譯而非解釋成可執行碼的Java環(huán)境。常規的程序不使用它。

  1. 13、  Thread,ThreadGroup和Runnable


Runnable接口以及Thread和ThreadGroup類(lèi)支持多線(xiàn)程編程。下面分別予以說(shuō)明。
注意:關(guān)于管理線(xiàn)程,實(shí)現Runnable接口以及創(chuàng )建多線(xiàn)程程序的概述已在第11章中介紹過(guò)。

  1. 13.1  Runnable接口

Runnable接口必須由啟動(dòng)執行的獨立線(xiàn)程的類(lèi)所實(shí)現。Runnable僅定義了一種抽象方法,叫做run( )。該方法是線(xiàn)程的入口點(diǎn)。它的形式如下所示:
abstract void run( )
所創(chuàng )建的線(xiàn)程必須實(shí)現該方法。

  1. 13.2  Thread


Thread創(chuàng )建一個(gè)新的執行線(xiàn)程。它定義了如下的構造函數:
Thread( )
Thread(Runnable threadOb)
Thread(Runnable threadOb, StringthreadName)
Thread(String threadName)
Thread(ThreadGroup groupOb, Runnable threadOb)
Thread(ThreadGroup groupOb, Runnable threadOb, String threadName)
Thread(ThreadGroup groupOb, String threadName)
threadOb是實(shí)現Runnable接口的類(lèi)的一個(gè)實(shí)例,它定義了線(xiàn)程運行開(kāi)始的地方。線(xiàn)程的名字由threadName指定。當名字未被指定時(shí),Java虛擬機將創(chuàng )建一個(gè)。groupOb指定了新線(xiàn)程所屬的線(xiàn)程組。當沒(méi)有線(xiàn)程組被指定時(shí),新線(xiàn)程與其父線(xiàn)程屬于同一線(xiàn)程組。
下面的常數由Thread定義:
MAX_PRIORITY
MIN_PRIORITY
NORM_PRIORITY
正如所期望的那樣,這些常數指定了最大,最小以及默認的線(xiàn)程優(yōu)先權。
由Thread定義的方法列在表14-16中。在比Java 2早的版本中,Thread中也包括了stop( ),suspend( )以及resume( )方法。然而正如在第11章中解釋的那樣,這些方法由于其固有的不穩定性而在Java 2中被擯棄了。在Java 2中擯棄的還有countStackFrames( )方法,因為它調用了suspend( )方法。
表16  由Thread定義的方法
方法 描述 
static int activeCount( )  返回線(xiàn)程所屬的線(xiàn)程組中線(xiàn)程的個(gè)數 
void checkAccess( )  引起安全管理程序檢驗當前的線(xiàn)程能訪(fǎng)問(wèn)和/或能改變在其上checkAccess( )方法被調用的線(xiàn)程 
static Thread currentThread( )  返回一個(gè)Thread對象,該對象封裝了調用這個(gè)方法的線(xiàn)程 
void destroy( )  終止線(xiàn)程 
static int enumerate(Thread threads[ ])  將當前線(xiàn)程組中的所有Thread對象的拷貝放入threads中。返回線(xiàn)程的個(gè)數 
ClassLoader getContextClassLoader( )  返回用于對這個(gè)線(xiàn)程加載類(lèi)和資源的類(lèi)加載程序(在Java 2中新增加的) 
final String getName( )  返回線(xiàn)程名 
final int getPriority( )  返回線(xiàn)程的屬性設置 
final ThreadGroup getThreadGroup( )  返回調用線(xiàn)程是其中一個(gè)成員的ThreadGroup對象 
void interrupt( )  中斷線(xiàn)程 
static boolean interrupted( )  如果當前執行的線(xiàn)程已經(jīng)被預先設置了中斷,則返回true;否則,返回false 
final boolean isAlive( )  如果線(xiàn)程仍在運行中,則返回true;否則返回false 
final boolean isDaemon( )  如果線(xiàn)程是一個(gè)后臺進(jìn)程線(xiàn)程(Java運行系統的一部分),則返回true;否則返回false 
boolean isInterrupted( )  如果線(xiàn)程被中斷,則返回true,否則返回false 
final void join( )   throws InterruptedException 等待直至線(xiàn)程終止 
續表
方法 描述 
final void join(long milliseconds)   throws InterruptedException 等待直到為終止線(xiàn)程而指定的以毫秒計時(shí)的時(shí)間 
final void join(long milliseconds, int nanoseconds)   throws InterruptedException 等待直到為終止線(xiàn)程而指定的以毫秒加毫微秒計時(shí)的時(shí)間 
void run( )  開(kāi)始線(xiàn)程的執行 
void setContextClassLoader(ClassLoader cl)  設置將被調用線(xiàn)程用于cl的類(lèi)加載程序(在Java 2中新增加的) 
final void setDaemon(boolean state)  標記線(xiàn)程為后臺進(jìn)程線(xiàn)程 
final void setName(String threadName)  將線(xiàn)程的名字設置為由threadName指定的名字 
final void setPriority(int priority)  設置由priority指定的線(xiàn)程優(yōu)先權 
static void sleep(long milliseconds)   throws InterruptedException 以指定的毫秒為單位的時(shí)間長(cháng)度掛起執行的線(xiàn)程 
static void sleep(long milliseconds, int nanoseconds)   throws InterruptedException 以指定的毫秒加毫微秒為單位的時(shí)間長(cháng)度掛起執行的線(xiàn)程 
void start( )  開(kāi)始線(xiàn)程的執行 
String toString( )  返回線(xiàn)程的等價(jià)字符串形式 
static void yield( )  調用線(xiàn)程將CPU讓給其他的線(xiàn)程 
14.13.3  ThreadGroup
線(xiàn)程組(ThreadGroup)創(chuàng )建了一組線(xiàn)程。它定義了如下的兩個(gè)構造函數:
ThreadGroup(String groupName)
ThreadGroup(ThreadGroup parentOb, String groupName)
對于兩種形式,groupName指定了線(xiàn)程組的名字。第一種形式創(chuàng )建一個(gè)新的線(xiàn)程組,該線(xiàn)程組將當前的線(xiàn)程作為它的父線(xiàn)程。在第二種形式中,父線(xiàn)程由parentOb指定。
由ThreadGroup定義的方法列在表14-17中。在比Java 2更早出現的Java版本中,ThreadGroup中也包括了stop( ),suspend( )以及resume( )方法。這些方法由于其本身固有的不穩定性,而在Java 2中被擯棄。
表14-17  由ThreadGroup定義的方法
方法 描述 
int activeCount( )  返回線(xiàn)程組加上以這個(gè)線(xiàn)程作為父類(lèi)的所有線(xiàn)程組中線(xiàn)程的個(gè)數 
int activeGroupCount( )  返回調用線(xiàn)程是父類(lèi)的線(xiàn)程的組數 
final void checkAccess( )  引起安全管理程序檢驗調用線(xiàn)程能訪(fǎng)問(wèn)和/或能改變在其上checkAccess( )方法被調用的線(xiàn)程組 

final void destroy( )  撤消被調用的線(xiàn)程組(以及任一子線(xiàn)程組) 
int enumerate(Thread group[ ])  將構成調用線(xiàn)程組的線(xiàn)程放入group數組中 
int enumerate(Thread group[ ], boolean all)  將構成調用線(xiàn)程組的線(xiàn)程放入group數組中。如果all為true,那么線(xiàn)程組的所有子線(xiàn)程組中的線(xiàn)程也被放入group中 
int enumerate(ThreadGroup group[ ])  將調用線(xiàn)程組的子線(xiàn)程組放入group數組中 
int enumerate(ThreadGroup group[ ],   boolean all) 將調用線(xiàn)程組的子線(xiàn)程組放入group數組中。如果all為true,所有子線(xiàn)程組的子線(xiàn)程組(等等)也被放入group中 
final int getMaxPriority( )  返回對線(xiàn)程組設置的最大優(yōu)先權 
final String getName( )  返回線(xiàn)程組名 
final ThreadGroup getParent( )  如果調用ThreadGroup對象沒(méi)有父類(lèi),則返回null;否則返回調用對象的父類(lèi) 
final void interrupt( )  調用線(xiàn)程組中所有線(xiàn)程的interrupt( )方法(在Java 2中新增加的) 
final boolean isDaemon( )  如果線(xiàn)程組是一個(gè)端口后臺進(jìn)程組,則返回true;否則返回false 
boolean isDestroyed( )  如果線(xiàn)程組已經(jīng)被破壞,則返回true;否則,返回false 
void list( )  顯示關(guān)于線(xiàn)程組的信息 
final boolean parentOf(ThreadGroup group)  如果調用線(xiàn)程是group的父線(xiàn)程(或group本身),則返回true;否則返回false 
final void setDaemon(boolean isDaemon) 如果isDaemon為true,那么調用線(xiàn)程組被標記為一個(gè)端口后臺進(jìn)程組 
final void setMaxPriority(int priority)  對調用線(xiàn)程組設置最大優(yōu)先權priority 
String toString( )  返回線(xiàn)程組的字符串等價(jià)形式 
void uncaughtException(Thread thread,  Throwable e) 當一個(gè)異常未被捕獲時(shí),該方法被調用 
線(xiàn)程組提供了一種方便的方法,可以將一組線(xiàn)程當做一個(gè)單元來(lái)管理。這在想掛起或恢復一些相關(guān)的線(xiàn)程的情況下,是特別有用的。例如假想在一個(gè)程序中,有一組線(xiàn)程被用來(lái)打印文檔,另一組線(xiàn)程被用來(lái)將該文檔顯示在屏幕上,同時(shí)另一組線(xiàn)程將文檔保存為磁盤(pán)文件。如果打印被異常中止了,想用一種很簡(jiǎn)單的方法停止所有與打印有關(guān)的線(xiàn)程。線(xiàn)程組為這種處理提供了方便。下面的程序說(shuō)明了這種用法,在程序中創(chuàng )建兩個(gè)線(xiàn)程組,每一線(xiàn)程組中有兩個(gè)線(xiàn)程:
// Demonstrate thread groups.
class NewThread extends Thread {
  boolean suspendFlag;

  NewThread(String threadname, ThreadGroup tgOb) {
    super(tgOb, threadname);
    System.out.println("New thread: " + this);
    suspendFlag = false;
    start(); // Start the thread
  }

  // This is the entry point for thread.
  public void run() {
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println(getName() + ": " + i);
        Thread.sleep(1000);
        synchronized(this) {
          while(suspendFlag) {
            wait();
          }
        }
      }
    } catch (Exception e) {
      System.out.println("Exception in " + getName());
    }
    System.out.println(getName() + " exiting.");
  }

  void mysuspend() {
    suspendFlag = true;
  }

  synchronized void myresume() {
    suspendFlag = false;
    notify();
  }
}

class ThreadGroupDemo {
  public static void main(String args[]) {
    ThreadGroup groupA = new ThreadGroup("Group A");
    ThreadGroup groupB = new ThreadGroup("Group B");

    NewThread ob1 = new NewThread("One", groupA);
    NewThread ob2 = new NewThread("Two", groupA);
    NewThread ob3 = new NewThread("Three", groupB);
    NewThread ob4 = new NewThread("Four", groupB);

    System.out.println("\nHere is output from list():");
    groupA.list();
    groupB.list();
    System.out.println();

    System.out.println("Suspending Group A");
    Thread tga[] = new Thread[groupA.activeCount()];
    groupA.enumerate(tga); // get threads in group
    for(int i = 0; i < tga.length; i++) {
      ((NewThread)tga[i]).mysuspend(); // suspend each thread
    }

    try {
      Thread.sleep(4000); 
    } catch (InterruptedException e) {
      System.out.println("Main thread interrupted.");
    }

    System.out.println("Resuming Group A");
    for(int i = 0; i < tga.length; i++) {
      ((NewThread)tga[i]).myresume(); // resume threads in group
    }

    // wait for threads to finish
    try {
      System.out.println("Waiting for threads to finish.");
      ob1.join();
      ob2.join();
      ob3.join();
      ob4.join();
    } catch (Exception e) {
      System.out.println("Exception in Main thread");
    }

System.out.println("Main thread exiting.");
  }
}
該程序的一個(gè)輸出樣本如下所示:
New thread: Thread[One,5,Group A]
New thread: Thread[Two,5,Group A]
New thread: Thread[Three,5,Group B]
New thread: Thread[Four,5,Group B]
Here is output from list():
java.lang.ThreadGroup[name=Group A,maxpri=10]
  Thread[One,5,Group A]
  Thread[Two,5,Group A]
java.lang.ThreadGroup[name=Group B,maxpri=10]
  Thread[Three,5,Group B]
  Thread[Four,5,Group B]
Suspending Group A
Three: 5
Four: 5
Three: 4
Four: 4
Three: 3
Four: 3
Three: 2
Four: 2
Resuming Group A
Waiting for threads to finish.
One: 5
Two: 5
Three: 1
Four: 1
One: 4
Two: 4
Three exiting.
Four exiting.
One: 3
Two: 3
One: 2
Two: 2
One: 1
Two: 1
One exiting.
Two exiting.
Main thread exiting.
注意在這個(gè)程序中,線(xiàn)程組A被掛起四秒。由于輸出確認,造成線(xiàn)程O(píng)ne和線(xiàn)程Two暫停,但是線(xiàn)程Three和線(xiàn)程Four仍然運行。四秒鐘之后,線(xiàn)程O(píng)ne和線(xiàn)程Two被恢復。注意線(xiàn)程組A是如何被掛起和恢復的。首先通過(guò)對線(xiàn)程組A調用enumerate( )方法得到線(xiàn)程組A中的線(xiàn)程。然后每一個(gè)線(xiàn)程重復通過(guò)得到的數組而被掛起。為了恢復線(xiàn)程組A中的線(xiàn)程,序列再一次被遍歷,每一個(gè)線(xiàn)程被恢復。最后一點(diǎn):這個(gè)例子使用了Java 2推薦使用的方法去完成掛起和恢復線(xiàn)程的任務(wù)。而沒(méi)有用在Java 2中被擯棄的方法suspend( )和resume( )。

  1. 14 、 ThreadLocal和InheritableThreadLocal

在Java 2的java.lang中增加了兩個(gè)與線(xiàn)程有關(guān)的類(lèi):
 ThreadLocal?用于創(chuàng )建線(xiàn)程局部變量。每個(gè)線(xiàn)程都擁有自己局部變量的拷貝。
 InheritableThreadLocal?創(chuàng )建可以被繼承的線(xiàn)程局部變量。

  1. 15、  Package


在Java 2中增加了一個(gè)稱(chēng)為Package的類(lèi)。這個(gè)類(lèi)封裝了與包有關(guān)的版本數據。包版本信息由于包的增值以及由于Java程序可能需要知道哪些包版本可以利用而變得更加重要。Package中定義的方法列在表14-18中。下面的程序通過(guò)顯示程序當前已知的包而說(shuō)明了Package。
表18  由Package定義的方法
方法 描述 
String getImplementationTitle( ) 返回調用包的標題 
String getImplementationVendor( )  返回調用包的實(shí)現程序的程序名 
String getImplementationVersion( )  返回調用包的版本號 
String getName( )  返回調用包的名字 
Static Package getPackage(String pkgName)  返回一個(gè)由pkgName指定的Package對象 
Static Package[ ] getPackages( )  返回調用程序當前已知的所有包 
String getSpecificationTitle( )  返回調用包的規格說(shuō)明的標題 
String getSpecificationVendor( )  返回對調用包的規格說(shuō)明的所有者的名字 
String getSpecificationVersion( ) 返回調用包的規格說(shuō)明的版本號 
Int hashCode( ) 返回調用包的散列碼 
Boolean isCompatibleWith(String verNum)   throws NumberFormatException 如果verNum小于或等于調用包的版本號,則返回true 
Boolean isSealed( ) 如果調用包被封,則返回true;否則返回false 
Boolean isSealed(URL url) 如果調用包相對于url被封,則返回true;否則返回false。 
String toString( ) 返回調用包的等價(jià)字符串形式 
// Demonstrate Package
class PkgTest {
  public static void main(String args[]) {
    Package pkgs[];

    pkgs = Package.getPackages();

    for(int i=0; i < pkgs.length; i++)
      System.out.println(
             pkgs[i].getName() + " " +
             pkgs[i].getImplementationTitle() + " " +
             pkgs[i].getImplementationVendor() + " " +
             pkgs[i].getImplementationVersion()
      );

  }
}

在Java 2的java.lang中也新增加了RuntimePermission。它與Java的安全機制有關(guān),這里不做進(jìn)一步的討論。

  1. 17、  Throwable


Throwable類(lèi)支持Java的異常處理系統,它是派生所有異常類(lèi)的類(lèi)。在本書(shū)第10章已經(jīng)討論過(guò)它。

  1. 18、  SecurityManager


SecurityManager是一個(gè)子類(lèi)可以實(shí)現的抽象類(lèi),它用于創(chuàng )建一個(gè)安全管理程序。一般不需要實(shí)現自己的安全管理程序,如果非要這樣做,需要查閱與你的Java開(kāi)發(fā)系統一起得到的相關(guān)文檔。

  1. 19 、 Comparable接口


Java 2在java.lang中新增加了一個(gè)接口:Comparable。實(shí)現Comparable的類(lèi)的對象可以被排序。換句話(huà)說(shuō),實(shí)現Comparable的類(lèi)包含了可以按某種有意義的方式進(jìn)行比較的對象。Comparable接口說(shuō)明了一個(gè)方法,該方法用于確定Java 2調用一個(gè)類(lèi)的實(shí)例的自然順序。該方法如下所示:
int compareTo(Object obj)
這個(gè)方法比較調用對象和obj。如果他們相等,就返回0。如果調用對象比obj小,則返回一個(gè)負值。否則返回一個(gè)正值。
該接口由前面已經(jīng)介紹的幾種類(lèi)實(shí)現。特別是Byte,Character,Double,Float,Long,Short,String以及Integer類(lèi)定義了compareTo( )方法。另外,下一章將會(huì )介紹到,實(shí)現這個(gè)接口的對象可以被使用在不同的集合中。

  1. 20 、 java.lang.ref和java.lang.reflect包


在Java中定義了兩個(gè)java.lang的子包:java.lang.ref和java.lang.reflect。下面分別予以簡(jiǎn)單介紹。

  1. 20.1 、 java.lang.ref

在前面學(xué)到過(guò),在Java中,垃圾回收工具自動(dòng)確定何時(shí)對一個(gè)對象,沒(méi)有引用存在。然后這個(gè)對象就被認為是不再需要的,同時(shí)它所占的內存也被釋放。在Java 2中新增加的java.lang.ref包中的類(lèi)對垃圾回收處理提供更加靈活的控制。例如,假設你的程序創(chuàng )建了大量的在后面某個(gè)時(shí)間又想重新使用的對象,可以持續保持對這些對象的引用,但是這可能需要更多的內存開(kāi)銷(xiāo)。
作為替代,可以對這些對象定義“軟”引用。如果可以利用的內存接近用完的話(huà),一個(gè)可以“軟實(shí)現”的對象可以從垃圾回收工具中釋放。在那種情況下,垃圾回收工具將這個(gè)對象的“軟”引用設為空(null)。否則,垃圾回收工具保存對象以便以后使用。
程序設計人員具有確定是否一個(gè)“軟實(shí)現”的對象被釋放的能力。如果它被釋放了,可以重新創(chuàng )建它。如果沒(méi)有釋放,該對象對于后面的應用將一直是可以利用的。也可以為對象創(chuàng )建“弱”(weak)和“假想”(phantom)引用,不過(guò)關(guān)于這些以及java.lang.ref包中其他特性的討論已經(jīng)超過(guò)了本書(shū)的范圍。

  1. 20.2、  java.lang.reflect


Reflection是一個(gè)程序分析自己的能力。包java.lang.reflect提供了獲得關(guān)于一個(gè)類(lèi)的域、構造函數、方法和修改符的能力。需要這些信息去創(chuàng )建可以使你利用Java Beans組件的軟件工具。這個(gè)工具使用映射動(dòng)態(tài)地確定組件的特征。這個(gè)主題將在第25章中討論。
另外,包java.lang.reflect包括了一個(gè)可以動(dòng)態(tài)創(chuàng )建和訪(fǎng)問(wèn)數組的類(lèi)。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java面試題集
Java Class類(lèi)及反射機制
JAVA基本數據類(lèi)型與引用數據類(lèi)型
學(xué)習Java的筆記(2)
Java基礎總結篇
JAVA面試題26-107(答案)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久