在java開發之中,經常會涉及到不同基礎數據之間進行相互轉換。JAVA語言除了布爾類型的數據外,其他的7種數據類型之間可以相互轉換。
java之中類型轉換方式分兩種:自動類型轉換和強制類型轉換:
1.自動類型轉換:
所謂自動類型轉換,是指系統支持把某種基礎類型直接付給另一種基礎類型的變量。
注意:自動類型轉換的前提條件,必須是把表數范圍小的數值或變量賦給表數范圍大的變量。
其實很好理解,我們都知道數值型類型主要區別是分配的內存空間大小不同,可以想象一杯水往一個容積大的空桶之中倒進,水不會流出來,相反如果一桶水往一個小的空間杯子里面倒進的時候,水就會溢出。
所以java支持自動類型轉換如上圖所示。
2.強制類型轉換:
同樣的,小桶里的水可以倒到大桶里面,難道大桶里面的水不能夠到進入小桶里面嗎?正所謂藝術源於生活,代碼何嘗不是,只要是大桶里面的水沒有超過小桶的容積,就可以到進去。所以,java引入了強制轉換的概念。
強制轉換的語法格式是:(targetType)value,強制轉換的運算符是圓括號(())。
強制轉換需要注意點:
1).把一個浮點數強制轉換為整數時,java會直接截斷浮點數的小數部分。
2).把一個超出數據范圍的數值賦給數據類型是,會出現數據溢出的情況,造成數據的缺失。
例如:把233強制類型轉換為byte類型的整數,而變成-23,其中里面的變化如下圖。
如上圖32位int類型的233在內存中如上圖所示,強制類型轉換為8位的byte類型,則需要截斷前面24位,只保留右邊8位,最左邊的1是一個符號位,此處表明這是一個負數,負數在計算機里面是以補碼形式存在的,因此還需要換算成原碼。將補碼建議就得到反碼形式,再將反碼取反就可以得到原碼。
通常情況下,字符串不能直接轉換成基本類型,但是可以通過基本類型對應的包裝類則可以實現把字符串轉換成基本類型。
java為8種基本類型都提供了對應的包裝類:boolean 對應 Boolean 、byte 對應 Byte、short 對應 Short、int對應Integer 、 long 對應 Long、char 對應 Character 、float對應Float 、double 對應 Double
3.表達式類型自動提升
在綜合以上兩種方式,還有一種隱性的方式--表達式類型轉換。表達式歸根到底屬於自動類型轉換的范疇之中。
表達式類型轉換的自動提升規則:
1)所有的byte類型、short類型將被提升到int類型
2)整個算數表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。
例子:
short a = 5;
a= a-2;
這個時候會報錯,因為a-2表達式已經被提升到int類型,而把int類型的賦給short,會引發錯誤。正確的如下。
int b = a-2;
double d = a -2 +3.4;