1. 程式人生 > >JAVA——基本資料型別之間的自動轉換

JAVA——基本資料型別之間的自動轉換

曾經在筆試中考到:“在java裡,byte a=100,b=200;能否通過編譯?”,當時我一臉的茫然,記不清哪個教科書裡寫過這類東西,於是考完後進行了實驗,得到了如下的發現,現與大家分享下。

賦值的形式通常是:

A = B ;

A通常是一個變數或常量(但不能是字面值),A的資料型別記為S_A。B可以是一個變數值、表示式的值、字面值或方法返回值,對應的資料型別記為S_B。

字面值,指諸如:1234, 'a', 1234L, 1234.0f, 1234.1形式的值;

表示式的值,這裡指算術表示式的值,變數、常量和字面值都是算術表示式的組成部分。

常量值,指被final關鍵字修飾的變數的值。

方法返回值,視為一個變數的值即可。

  • 規則二:若S_A和S_B為整數型別或字元型(byte, short, int, long, char),B是字面值、常量值或常量表達式(即由常量或字面量構成的表示式)的值,且在S_A對應的數值範圍之內(其資料型別對應的數值範圍可以超出),那麼在編譯期間也可以安全地進行數值型別轉換,編譯通過。(這個規則是隱含在編譯器中的;想想也是,機器能做的事就不要麻煩我們人去做)

下面給出幾個例子:

char c=64;//通過,對應規則二。 

int a='a';//通過,對應規則一。 

char d='a'+10;//通過,對應規則二。 

char e=65535;//通過,對應規則二。 

e=65536;//超出範圍了,

不通過,對應規則二。 

double s='b';//通過,對應規則一。 

byte bb=10,bc='a';//通過,對應規則二。 

byte bd='a'+1;//通過,對應規則二。 

byte bf='a'+250;//超出範圍了,不通過,對應規則二。 

byte be=1.0;//浮點數無法自動轉為整數,即便是1.0,不通過。 

final byte fba=10,fbb=118;//通過,對應規則二。

 /*fba是常量,整個表示式的值對應的型別雖然是int,但在編譯期間就能夠確定下來,因為是常量表達式,且未超出範圍。通過,對應規則二。*/

byte bg=fba+30;


/*bb不是常量,所以沒法在編譯期間確定值,為安全起見,需要顯示地進行資料型別轉換。對應規則二。*/


byte bh=fba+bb;//不通過
byte bk=(byte)(fba+bb);//通過。顯示地強制型別轉換。

/*算術表示式最窄提升到int型,所以即使兩個byte相加(只要有一個既不是字面值也不是常量,否則的話還要看看最終的值是否超出範圍),也要用int型變數儲存。對應規則二*/
short sh=fba+bb;//不通過

int ish=fba+bb;//通過

本文采用的實驗環境是jdk1.7.0_21。如有錯誤,還請指正,非常感謝。得意