以前一直對java中的類型轉換了解的不是很清楚,因為平時寫代碼有IDE的幫助,所以往往忽略這一塊的內容,但往往就是這樣的小知識點不清楚,很有可能造成很大的錯誤。所以在閑暇時間總結一下這些可能被遺忘的知識點。網上已經有很多相關的介紹文章了,現在來梳理一番:
基本類型
- 基本類型優先級
首先來看java中的基本類型有哪些:
byte:byte數據類型是一個8位有符號二進制補碼整數。
short:short數據類型為16位有符號二進制補碼整數。
int:int數據類型是一個32位有符號二進制補碼整數
long: long數據類型是一個64位二進制補碼整數
float: float數據類型是單精度、32位、符合IEEE 754標準的浮點數
boolean: boolean數據類型只有兩個可能的值:true和false
double: double數據類型是雙精度、64位、符合IEEE 754標準的浮點數;
char: char數據類型是一個16位的Unicode字符
基本類型優先級由低到高排序:
(byte short char) int long float double
其中,byte short char 平級
- 轉換規則
1.有多種數據類型混合計算的時候,低優先級類型自動提升為優先級最大的那個類型再來繼續計算
3.高優先級類型轉換為低優先級類型時,需要強制類型轉換,并且有可能丟失精度或溢出。
2.byte short char 他們三者在計算時,首先會轉換為int類型
3.由于byte short char三者平級,他們之間互相轉換時需進行強制類型轉換。
4.boolean不能與其他類型轉換
類類型
類類型之間的轉換有以下幾個規則:
1.當源類型與目標類型不存在父子關系時,轉換無法進行,編譯時會出現錯誤。包括兩個類為繼承同一個父類這種情況,也是不可以進行轉換的。
2.源類型是子類,目標類型是父類時,不必強制轉換。只是屏蔽了一些子類才有的功能。
3.源類型是父類,目標類型是子類時,要分兩種情況:第一,源類型指向的對象就是父類類型。此時不能進行強制轉換,編譯器可以通過,但運行時會報類型轉換錯誤。第二,源類型指向的對象是子類類型。此時可以進行強制轉換,還原子類。
說的比較拗口,用代碼來解釋吧。
public class Test {
class Father {}
class Son extends Father{}
class Daughter extends Father {}
@org.junit.Test
public void test(){
Father fatherApp;
Son sonApp;
Daughter daughterApp;
Father fatherIns=new Father();
Son sonIns=new Son();
Daughter daughterIns=new Daughter();
//目標類型為父類,源類型為子類,自動轉換
fatherApp=sonIns;
//源類型為父類,目標類型為子類,且源類型指向父類對象,運行時報錯。
sonApp=(Son) fatherIns;
//源類型為父類,目標類型為子類,且源類型指向子類對象,還原子類
sonApp=(Son) fatherApp;
//目標類型與源類型不存在父子關系,編譯無法通過
daughterApp=sonIns;
}
}