Java基本數(shù)據(jù)類型之間是存在固定的轉(zhuǎn)換規(guī)則的,現(xiàn)總結(jié)出以下6條規(guī)則,無(wú)論是哪個(gè)程序,將這6個(gè)規(guī)則套用進(jìn)去,問(wèn)題迎刃而解:
● 八種基本數(shù)據(jù)類型中,除boolean類型不能轉(zhuǎn)換,剩下七種類型之間都可以進(jìn)行轉(zhuǎn)換;
● 如果整數(shù)型字面量沒(méi)有超出byte,short,char的取值范圍,可以直接將其賦值給byte,short,char類型的變量;
● 小容量向大容量轉(zhuǎn)換稱為自動(dòng)類型轉(zhuǎn)換,容量從小到大的排序?yàn)椋?/span>byte < short(char) < int < long < float < double
注:short和char都占用兩個(gè)字節(jié),但是char可以表示更大的正整數(shù);
● 大容量轉(zhuǎn)換成小容量,稱為強(qiáng)制類型轉(zhuǎn)換,編寫時(shí)必須添加“強(qiáng)制類型轉(zhuǎn)換符”,但運(yùn)行時(shí)可能出現(xiàn)精度損失,謹(jǐn)慎使用;
● byte,short,char類型混合運(yùn)算時(shí),先各自轉(zhuǎn)換成int類型再做運(yùn)算;
● 多種數(shù)據(jù)類型混合運(yùn)算,各自先轉(zhuǎn)換成容量最大的那一種再做運(yùn)算;
接下來(lái),根據(jù)以上的6條規(guī)則,我們來(lái)看一下以下代碼,指出哪些代碼編譯報(bào)錯(cuò),以及怎么解決:
public class TypeConversionTest {
public static void main(String[] args) {
byte b1 = 1000;
byte b2 = 20;
short s = 1000;
int c = 1000;
long d = c;
int e = d;
int f = 10 / 3;
long g = 10;
int h = g / 3;
long m = g / 3;
byte x = (byte)g / 3;
short y = (short)(g / 3);
short i = 10;
byte j = 5;
short k = i + j;
int n = i + j;
char cc = 'a';
System.out.println("cc = " + cc);
System.out.println((byte)cc);
int o = cc + 100;
System.out.println(o);
}
}
編譯報(bào)錯(cuò),錯(cuò)誤信息如下所示:
圖4-16:類型轉(zhuǎn)換編譯錯(cuò)誤提示信息
如何修改,請(qǐng)看以下代碼:
public class TypeConversionTest {
public static void main(String[] args) {
//1000超出byte取值范圍,不能直接賦值
//byte b1 = 1000;
//如果想讓上面程序編譯通過(guò),可以手動(dòng)強(qiáng)制類型轉(zhuǎn)換,但程序運(yùn)行時(shí)會(huì)損失精度
byte b1 = (byte)1000;
//20沒(méi)有超出byte取值范圍,可以直接賦值
byte b2 = 20;
//1000沒(méi)有超出short取值范圍,可以直接賦值
short s = 1000;
//1000本身就是int類型,以下程序不存在類型轉(zhuǎn)換
int c = 1000;
//小容量賦值給大容量屬于自動(dòng)類型轉(zhuǎn)換
long d = c;
//大容量無(wú)法直接賦值給小容量
//int e = d;
//加強(qiáng)制類型轉(zhuǎn)換符
int e = (int)d;
//int類型和int類型相除最后還是int類型,所以結(jié)果是3
int f = 10 / 3;
long g = 10;
//g是long類型,long類型和int類型最終結(jié)果是long類型,無(wú)法賦值給int類型
//int h = g / 3;
//添加強(qiáng)制類型轉(zhuǎn)換符
int h = (int)(g / 3);
//long類型賦值給long類型
long m = g / 3;
//g先轉(zhuǎn)換成byte,byte和int運(yùn)算,最后是int類型,無(wú)法直接賦值給byte
//byte x = (byte)g / 3;
//將以上程序的優(yōu)先級(jí)修改一下
byte x = (byte)(g / 3);
short y = (short)(g / 3);
short i = 10;
byte j = 5;
//short和byte運(yùn)算時(shí)先各自轉(zhuǎn)換成int再做運(yùn)算,結(jié)果是int類型,無(wú)法賦值給short
//short k = i + j;
int n = i + j;
char cc = 'a';
System.out.println("cc = " + cc);
//將字符型char轉(zhuǎn)換成數(shù)字,'a'對(duì)應(yīng)的ASCII是97
System.out.println((byte)cc);
//char類型和int類型混合運(yùn)算,char類型先轉(zhuǎn)換成int再做運(yùn)算,最終197
int o = cc + 100;
System.out.println(o);
}
}
運(yùn)行結(jié)果如下圖所示:

圖4-17:類型轉(zhuǎn)換測(cè)試