類型轉(zhuǎn)換
Java 語言是一種強(qiáng)類型的語言。強(qiáng)類型的語言有以下幾個要求:
變量或常量必須有類型:要求聲明變量或常量時必須聲明類型,而且只能在聲明以后才能使用。
賦值時類型必須一致:值的類型必須和變量或常量的類型完全一致。
運算時類型必須一致:參與運算的數(shù)據(jù)類型必須一致才能運算。
但是在實際的使用中,經(jīng)常需要在不同類型的值之間進(jìn)行操作,這就需要一種新的語法來適應(yīng)這種需要,這個語法就是數(shù)據(jù)類型轉(zhuǎn)換。
在數(shù)值處理這部分,計算機(jī)和現(xiàn)實的邏輯不太一樣,對于現(xiàn)實來說,1和 1.0 沒有什么區(qū)別,但是對于計算機(jī)來說,1 是整數(shù)類型,而 1.0 是小數(shù)類型,其在內(nèi)存中的存儲方式以及占用的空間都不一樣,所以類型轉(zhuǎn)換在計算機(jī)內(nèi)部是必須的。
Java 語言中的數(shù)據(jù)類型轉(zhuǎn)換有兩種:
自動類型轉(zhuǎn)換:編譯器自動完成類型轉(zhuǎn)換,不需要在程序中編寫代碼。
強(qiáng)制類型轉(zhuǎn)換:強(qiáng)制編譯器進(jìn)行類型轉(zhuǎn)換,必須在程序中編寫代碼。
由于基本數(shù)據(jù)類型中 boolean 類型不是數(shù)字型,所以基本數(shù)據(jù)類型的轉(zhuǎn)換是除了 boolean 類型以外的其它 7 種類型之間的轉(zhuǎn)換。下面來具體介紹兩種類型轉(zhuǎn)換的規(guī)則、適用場合以及使用時需要注意的問題。
自動類型轉(zhuǎn)換
自動類型轉(zhuǎn)換,也稱隱式類型轉(zhuǎn)換,是指不需要書寫代碼,由系統(tǒng)自動完成的類型轉(zhuǎn)換。由于實際開發(fā)中這樣的類型轉(zhuǎn)換很多,所以 Java 語言在設(shè)計時,沒有為該操作設(shè)計語法,而是由 JVM 自動完成。
轉(zhuǎn)換規(guī)則:從存儲范圍小的類型到存儲范圍大的類型。
具體規(guī)則為:byte→short(char)→int→long→float→double
也就是說 byte 類型的變量可以自動轉(zhuǎn)換為 short 類型,示例代碼:
byte b = 10;
short sh = b;
這里在賦值時,JVM 首先將 b 的值轉(zhuǎn)換為 short 類型,然后再賦值給 sh。
在類型轉(zhuǎn)換時可以跳躍。示例代碼:
byte b1 = 100;
int n = b1;
注意問題:在整數(shù)之間進(jìn)行類型轉(zhuǎn)換時,數(shù)值不發(fā)生改變,而將整數(shù)類型,特別是比較大的整數(shù)類型轉(zhuǎn)換成小數(shù)類型時,由于存儲方式不同,有可能存在數(shù)據(jù)精度的損失。
強(qiáng)制類型轉(zhuǎn)換
強(qiáng)制類型轉(zhuǎn)換,也稱顯式類型轉(zhuǎn)換,是指必須書寫代碼才能完成的類型轉(zhuǎn)換。該類類型轉(zhuǎn)換很可能存在精度的損失,所以必須書寫相應(yīng)的代碼,并且能夠忍受該種損失時才進(jìn)行該類型的轉(zhuǎn)換。
轉(zhuǎn)換規(guī)則:從存儲范圍大的類型到存儲范圍小的類型。
具體規(guī)則為:double→float→long→int→short(char)→byte
語法格式為:(轉(zhuǎn)換到的類型)需要轉(zhuǎn)換的值
示例代碼:
double d = 3.10;
int n = (int)d;
這里將 double 類型的變量 d 強(qiáng)制轉(zhuǎn)換成 int 類型,然后賦值給變量 n。需要說明的是小數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù),采用的是“去 1 法”,也就是無條件的舍棄小數(shù)點的所有數(shù)字,則以上轉(zhuǎn)換出的結(jié)果是 3。整數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù)時取數(shù)字的低位,例如 int 類型的變量轉(zhuǎn)換為 byte 類型時,則只去 int 類型的低 8 位(也就是最后一個字節(jié))的值。
示例代碼:
int n = 123;
byte b = (byte)n;
int m = 1234;
byte b1 = (byte)m;
則 b 的值還是 123,而 b1 的值為-46。b1 的計算方法如下:m 的值轉(zhuǎn)換為二進(jìn)制是10011010010,取該數(shù)字低8位的值作為b1的值,則b1的二進(jìn)制值是11010010,按照機(jī)器數(shù)的規(guī)定,最高位是符號位,1 代表負(fù)數(shù),在計算機(jī)中負(fù)數(shù)存儲的是補(bǔ)碼,則該負(fù)數(shù)的原碼是 10101110,該值就是十進(jìn)制的-46。
注意問題:強(qiáng)制類型轉(zhuǎn)換通常都會存儲精度的損失,所以使用時需要謹(jǐn)慎。