如果你以前有編程經(jīng)驗,那么你已經(jīng)知道把一種類型的值賦給另外類型的一個變量是相當(dāng)常見的。如果這2種類型是兼容的,那么Java 將自動地進(jìn)行轉(zhuǎn)換。例如,把int 類型的值賦給long 類型的變量,總是可行的。然而,不是所有的類型都是兼容的,因此,不是所有的類型轉(zhuǎn)換都是可以隱式實現(xiàn)的。例如,沒有將double 型轉(zhuǎn)換為byte 型的定義。幸好,獲得不兼容的類型之間的轉(zhuǎn)換仍然是可能的。要達(dá)到這個目的,你必須使用一個強(qiáng)制類型轉(zhuǎn)換,它能完成兩個不兼容的類型之間的顯式變換。讓我們看看自動類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。
3.9.1 Java 的自動轉(zhuǎn)換
如果下列2個條件都能滿足,那么將一種類型的數(shù)據(jù)賦給另外一種類型變量時,將執(zhí)行自動類型轉(zhuǎn)換(automatic type conversion):
種類型是兼容的。
目的類型數(shù)的范圍比來源類型的大。
當(dāng)以上2個條件都滿足時,拓寬轉(zhuǎn)換(widening conversion )發(fā)生。例如,int 型的范圍比所有byte 型的合法范圍大,因此不要求顯式強(qiáng)制類型轉(zhuǎn)換語句。
對于拓寬轉(zhuǎn)換,數(shù)字類型,包括整數(shù)(integer )和浮點(floating-point )類型都是彼此兼容的,但是,數(shù)字類型和字符類型(char)或布爾類型(bollean )是不兼容的。字符類型(char )和布爾類型(bollean )也是互相不兼容的。
3.9.2 不兼容類型的強(qiáng)制轉(zhuǎn)換
盡管自動類型轉(zhuǎn)換是很有幫助的,但并不能滿足所有的編程需要。例如,如果你需要將int 型的值賦給一個byte 型的變量,你將怎么辦?這種轉(zhuǎn)換不會自動進(jìn)行,因為byte 型的變化范圍比int 型的要小。這種轉(zhuǎn)換有時稱為“縮小轉(zhuǎn)換”(),因為你肯定要將源數(shù)據(jù)類型的值變小才能適合目標(biāo)數(shù)據(jù)類型。
為了完成兩種不兼容類型之間的轉(zhuǎn)換,你就必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。所謂強(qiáng)制類型轉(zhuǎn)換只不過是一種顯式的類型變換。它的通用格式如下:
(target-type)value
其中,目標(biāo)類型(target-type )指定了要將指定值轉(zhuǎn)換成的類型。例如,下面的程序段將int 型強(qiáng)制轉(zhuǎn)換成byte 型。如果整數(shù)的值超出了byte 型的取值范圍,它的值將會因為對byte 型值域取模(整數(shù)除以byte 得到的余數(shù))而減少。
int a;
byte b;
// ...
b = (byte) a;
當(dāng)把浮點值賦給整數(shù)類型時一種不同的類型轉(zhuǎn)換發(fā)生了:截斷(truncation )。你知道整數(shù)沒有小數(shù)部分。這樣,當(dāng)把浮點值賦給整數(shù)類型時,它的小數(shù)部分會被舍去。例如,如果將值1.23賦給一個整數(shù),其結(jié)果值只是1,0.23 被丟棄了。當(dāng)然,如果浮點值太大而不能適合目標(biāo)整數(shù)類型,那么它的值將會因為對目標(biāo)類型值域取模而減少。
下面的程序說明了強(qiáng)制類型轉(zhuǎn)換:
// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}
該程序的輸出如下:
Conversion of int to byte.
i and b 257 1
Conversion of double to int.
d and i 323.142 323
Conversion of double to byte.
d and b 323.142 67
讓我們看看每一個類型轉(zhuǎn)換。當(dāng)值257被強(qiáng)制轉(zhuǎn)換為byte 變量時,其結(jié)果是257除以256 (256是byte 類型的變化范圍)的余數(shù)1。當(dāng)把變量d轉(zhuǎn)換為int 型,它的小數(shù)部分被舍棄了。當(dāng)把變量d轉(zhuǎn)換為byte 型,它的小數(shù)部分被舍棄了,而且它的值減少為256 的模,即67。
3.9.1 Java 的自動轉(zhuǎn)換
如果下列2個條件都能滿足,那么將一種類型的數(shù)據(jù)賦給另外一種類型變量時,將執(zhí)行自動類型轉(zhuǎn)換(automatic type conversion):
種類型是兼容的。
目的類型數(shù)的范圍比來源類型的大。
當(dāng)以上2個條件都滿足時,拓寬轉(zhuǎn)換(widening conversion )發(fā)生。例如,int 型的范圍比所有byte 型的合法范圍大,因此不要求顯式強(qiáng)制類型轉(zhuǎn)換語句。
對于拓寬轉(zhuǎn)換,數(shù)字類型,包括整數(shù)(integer )和浮點(floating-point )類型都是彼此兼容的,但是,數(shù)字類型和字符類型(char)或布爾類型(bollean )是不兼容的。字符類型(char )和布爾類型(bollean )也是互相不兼容的。
3.9.2 不兼容類型的強(qiáng)制轉(zhuǎn)換
盡管自動類型轉(zhuǎn)換是很有幫助的,但并不能滿足所有的編程需要。例如,如果你需要將int 型的值賦給一個byte 型的變量,你將怎么辦?這種轉(zhuǎn)換不會自動進(jìn)行,因為byte 型的變化范圍比int 型的要小。這種轉(zhuǎn)換有時稱為“縮小轉(zhuǎn)換”(),因為你肯定要將源數(shù)據(jù)類型的值變小才能適合目標(biāo)數(shù)據(jù)類型。
為了完成兩種不兼容類型之間的轉(zhuǎn)換,你就必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。所謂強(qiáng)制類型轉(zhuǎn)換只不過是一種顯式的類型變換。它的通用格式如下:
(target-type)value
其中,目標(biāo)類型(target-type )指定了要將指定值轉(zhuǎn)換成的類型。例如,下面的程序段將int 型強(qiáng)制轉(zhuǎn)換成byte 型。如果整數(shù)的值超出了byte 型的取值范圍,它的值將會因為對byte 型值域取模(整數(shù)除以byte 得到的余數(shù))而減少。
int a;
byte b;
// ...
b = (byte) a;
當(dāng)把浮點值賦給整數(shù)類型時一種不同的類型轉(zhuǎn)換發(fā)生了:截斷(truncation )。你知道整數(shù)沒有小數(shù)部分。這樣,當(dāng)把浮點值賦給整數(shù)類型時,它的小數(shù)部分會被舍去。例如,如果將值1.23賦給一個整數(shù),其結(jié)果值只是1,0.23 被丟棄了。當(dāng)然,如果浮點值太大而不能適合目標(biāo)整數(shù)類型,那么它的值將會因為對目標(biāo)類型值域取模而減少。
下面的程序說明了強(qiáng)制類型轉(zhuǎn)換:
// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}
該程序的輸出如下:
Conversion of int to byte.
i and b 257 1
Conversion of double to int.
d and i 323.142 323
Conversion of double to byte.
d and b 323.142 67
讓我們看看每一個類型轉(zhuǎn)換。當(dāng)值257被強(qiáng)制轉(zhuǎn)換為byte 變量時,其結(jié)果是257除以256 (256是byte 類型的變化范圍)的余數(shù)1。當(dāng)把變量d轉(zhuǎn)換為int 型,它的小數(shù)部分被舍棄了。當(dāng)把變量d轉(zhuǎn)換為byte 型,它的小數(shù)部分被舍棄了,而且它的值減少為256 的模,即67。