數(shù)據(jù)類型轉(zhuǎn)換
[toc]
一 數(shù)據(jù)類型轉(zhuǎn)換
數(shù)據(jù)類型的轉(zhuǎn)換是在所賦值的數(shù)值類型和被變量接收的數(shù)據(jù)類型不一致時發(fā)生的,它需要從一種數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。數(shù)據(jù)類型的轉(zhuǎn)換可以分為隱式轉(zhuǎn)換(自動類型轉(zhuǎn)換)和顯式轉(zhuǎn)換(強制類型轉(zhuǎn)換)兩種。
二 隱式轉(zhuǎn)換(自動類型轉(zhuǎn)換)
如果以下 2 個條件都滿足,那么將一種類型的數(shù)據(jù)賦給另外一種類型變量的時,將執(zhí)行自動類型轉(zhuǎn)換(automatic type conversion)。
- 兩種數(shù)據(jù)類型彼此兼容
- 目標(biāo)類型的取值范圍大于源數(shù)據(jù)類型(低級類型數(shù)據(jù)轉(zhuǎn)換成高級類型數(shù)據(jù))
當(dāng)以上 2 個條件都滿足時,拓寬轉(zhuǎn)換(widening conversion)發(fā)生。例如 byte 類型向 short 類型轉(zhuǎn)換時,由于 short 類型的取值范圍較大,會自動將 byte 轉(zhuǎn)換為 short 類型。
在運算過程中,由于不同的數(shù)據(jù)類型會轉(zhuǎn)換成同一種數(shù)據(jù)類型,所以整型、浮點型以及字符型都可以參與混合運算。自動轉(zhuǎn)換的規(guī)則是從低級類型數(shù)據(jù)轉(zhuǎn)換成高級類型數(shù)據(jù)。轉(zhuǎn)換規(guī)則如下:
- 數(shù)值型數(shù)據(jù)的轉(zhuǎn)換:byte→short→int→long→float→double。
- 字符型轉(zhuǎn)換為整型:char→int。
注意:char 類型比較特殊,char 自動轉(zhuǎn)換成 int、long、float 和 double,但 byte 和 short 不能自動轉(zhuǎn)換為 char,而且 char 也不能自動轉(zhuǎn)換為 byte 或 short。
以上數(shù)據(jù)類型的轉(zhuǎn)換遵循從左到右的轉(zhuǎn)換順序,最終轉(zhuǎn)換成表達(dá)式中表示范圍最大的變量的數(shù)據(jù)類型。
public class AutomaticTypeConversion {
public static void main(String[] args) {
//數(shù)值型數(shù)據(jù)的轉(zhuǎn)換:byte→short→int→long→float→double
byte bookPriceHongLouMengByte = 100; //定義書的價格:<<紅樓夢>>
short bookPriceHongLouMengShort = 101; //定義書的價格:<<紅樓夢>>
int bookPriceHongLouMengInt = 102; //定義書的價格:<<紅樓夢>>
float bookPriceHongLouMengFloat = 103.9f; //定義書的價格:<<紅樓夢>>
double bookPriceHongLouMengDouble = 104.9f; //定義書的價格:<<紅樓夢>>
bookPriceHongLouMengDouble = bookPriceHongLouMengByte;
System.out.println("byte自動類型轉(zhuǎn)換賦值給高級double: "+bookPriceHongLouMengDouble);
bookPriceHongLouMengDouble = bookPriceHongLouMengShort;
System.out.println("short自動類型轉(zhuǎn)換賦值給高級double: "+bookPriceHongLouMengDouble);
bookPriceHongLouMengDouble = bookPriceHongLouMengInt;
System.out.println("int自動類型轉(zhuǎn)換賦值給高級double: "+bookPriceHongLouMengDouble);
bookPriceHongLouMengDouble = bookPriceHongLouMengFloat;
System.out.println("float自動類型轉(zhuǎn)換賦值給高級double: "+bookPriceHongLouMengDouble);
int buyNum = 2; // 定義購買的數(shù)量
//在表達(dá)式計算中,buyNum同樣進行了自動類型轉(zhuǎn)換,先轉(zhuǎn)成double類型,再計算值.
double totalPrice = bookPriceHongLouMengDouble * buyNum ; // 計算總價,這里的*代表乘法的乘號.
System.out.println("一共付給書店" + totalPrice + "元"); // 輸出總價
// double作為浮點數(shù),用作價格計算需要注意精度問題.
}
}
三 顯式轉(zhuǎn)換(強制類型轉(zhuǎn)換)
自動類型轉(zhuǎn)換的是由低到高類型。有時候因為業(yè)務(wù)邏輯的需要,我們需要將高類型的轉(zhuǎn)換為低類型的。這種轉(zhuǎn)換是“縮小轉(zhuǎn)換”。
當(dāng)兩種數(shù)據(jù)類型不兼容,或目標(biāo)類型的取值范圍小于源類型時,自動轉(zhuǎn)換將無法進行,這時就需要進行強制類型轉(zhuǎn)換。其語法格式如下:
(type)variableName
public class MandatoryTypeConversion {
public static void main(String[] args) {
//數(shù)值型數(shù)據(jù)的轉(zhuǎn)換:byte→short→int→long→float→double
byte bookPriceHongLouMengByte = 100; //定義書的價格:<<紅樓夢>>
short bookPriceHongLouMengShort = 101; //定義書的價格:<<紅樓夢>>
int bookPriceHongLouMengInt = 102; //定義書的價格:<<紅樓夢>>
long bookPriceHongLouMengLong = 103; //定義書的價格:<<紅樓夢>>
float bookPriceHongLouMengFloat = 103.9f; //定義書的價格:<<紅樓夢>>
double bookPriceHongLouMengDouble = 104.9f; //定義書的價格:<<紅樓夢>>
bookPriceHongLouMengFloat = (float) bookPriceHongLouMengDouble;
System.out.println("double強制類型轉(zhuǎn)換賦值給低級float: "+bookPriceHongLouMengFloat);
bookPriceHongLouMengLong = (long) bookPriceHongLouMengDouble;
System.out.println("double強制類型轉(zhuǎn)換賦值給低級long: "+bookPriceHongLouMengLong);
bookPriceHongLouMengInt = (int) bookPriceHongLouMengDouble;
System.out.println("double強制類型轉(zhuǎn)換賦值給低級int: "+bookPriceHongLouMengInt);
bookPriceHongLouMengShort = (short)bookPriceHongLouMengFloat;
System.out.println("float強制類型轉(zhuǎn)換賦值給低級short: "+bookPriceHongLouMengShort);
bookPriceHongLouMengByte = (byte)bookPriceHongLouMengLong;
System.out.println("long強制類型轉(zhuǎn)換賦值給低級byte: "+bookPriceHongLouMengByte);
//在強制類型轉(zhuǎn)換中,如果是將浮點類型的值轉(zhuǎn)換為整數(shù),直接去掉小數(shù)點后邊的所有數(shù)字,而不是四舍五入;
int buyNum = 2; // 定義購買的數(shù)量
int totalPrice = (int) (bookPriceHongLouMengDouble * buyNum) ; // 計算總價得到浮點數(shù)值,將結(jié)果強制轉(zhuǎn)換為整數(shù).
System.out.println("一共付給書店" + totalPrice + "元整");
//強制類型轉(zhuǎn)換中,如果返回高級類型的值范圍大于原值,會出現(xiàn)數(shù)據(jù)失真。需要注意業(yè)務(wù)中的數(shù)據(jù)范圍這點。
bookPriceHongLouMengInt = 280;
bookPriceHongLouMengByte = (byte)bookPriceHongLouMengInt;
System.out.println("此處可以看到,數(shù)據(jù)值出現(xiàn)了異常:"+bookPriceHongLouMengByte);
}
}
四 類型轉(zhuǎn)換總結(jié)
數(shù)據(jù)類型轉(zhuǎn)換必須滿足如下規(guī)則:
- 不能對boolean類型進行類型轉(zhuǎn)換。
- 不能把對象類型轉(zhuǎn)換成不相關(guān)類的對象。
- 在把容量大的類型轉(zhuǎn)換為容量小的類型時必須使用強制類型轉(zhuǎn)換。
- 轉(zhuǎn)換過程中可能導(dǎo)致溢出(數(shù)據(jù)失真)或損失精度(小數(shù)位)。
強制轉(zhuǎn)換并賦值后,不改變原來變量的值。
文章和項目開源地址
一起學(xué)習(xí),最簡單易懂的Java零基礎(chǔ)入門,答疑解惑,關(guān)注點贊github開源:https://github.com/BradYan/easy-java