1. 程式人生 > >java資料型別和型別轉換(必須清楚)

java資料型別和型別轉換(必須清楚)

資料型別分類:

主要分為 基本型別、引用型別兩大類;

 

基本型別 轉換原則 

型別轉換主要在在 賦值、方法呼叫、算術運算 三種情況下發生。

 另外還有是直接數的賦值:先通過直接數判斷其型別,然後基本原則和上面談到的賦值原則基本一致;只是直接數是整數時特殊一點,當在可表示範圍內時,可以直接賦值給 byte short char三種類型;

算術運算 中的型別轉換:

 基本就是先轉換為高位資料型別,再參加運算,結果也是最高位的資料型別;

圖中有6個實心箭頭,表示無資訊丟失的轉換;有3個虛箭頭,表示可能有精度損失的轉換。

 
例如,123456789是一個大整數,它所包含的位數比float型別所能表達的位數多。當將這個整型數值轉換為float型別時,將會得到同樣大小的結果,但卻失去了一定的精度。 
如果兩個運算元(n,f)進行二元操作時,先要將兩個運算元轉換為同一種類型,然後再進行計算。

  • 如果兩個運算元中有一個是double型別,別一個運算元就會轉換為double型別。
  • 否則,如果其中一個運算元是float型別,另一個運算元將會轉換為float型別。
  • 否則,如果其中一個運算元是long型別,另一個運算元將會轉換為long型別。
  • 否則,兩個運算元都將被轉換為int型別。

強制型別轉換

在必要的時候,int型別的值將會自動地轉換為double型別。但另一方面,有時也需要將double轉換為int。在Java中,允許進行這種數值之間的型別轉換。 
當然,有可能會丟失一些資訊。在這種情況下,需要通過強制型別轉換(cast)實現這個操作。強制型別轉換的語法格式是在圓括號給出想要轉換的目標型別,後面緊跟著待轉換的變數名。例如:

double x = 9.997;
int nx = (int) x;

這樣,變數nx的值為9。強制型別轉換通過截斷小數部分將浮點值轉換為整形。 
如果想對浮點數進行舍入運算,以便得到最接近的整數,那就需要使用Math.round方法:

double x = 9.997;
int nx = (int)Math.round(x)

現在,變數nx的值為10。當呼叫round的時候,仍然需要使用強制型別轉換(int)。其原因是round方法返回的結果為long型別,由於存在資訊丟失的可能性,所以只有使用顯式的強制型別轉換才能將long型別轉換成int型別

特殊: 

(1)如採用+=、*=等縮略形式的運算子,系統會自動強制將運算結果轉換為目標變數的型別。

  (2)  當運算子為自動遞增運算子(++)或自動遞減運算子(--)時,如果運算元為byte,short或char型別不發生改變;

 

三、引用型別 轉換原則

 1、基本型別 與 對應包裝類 可自動轉換,這是自動裝箱和折箱的原理;    

        Integer c1 = new Integer(1);
        Integer c2 = 2;
        int cc = new Integer(3);

        //另:String 與 基本型別的互轉
        int i = Integer.parseInt("13");
        int ii = Integer.valueOf("12");

        String s1 = String.valueOf(123);
        String s2 = Integer.toString(i);
        String s3 = "" + i;

 2、兩個引用型別間轉換:

  • 子類能直接轉換為父類 或 介面型別;
  • 父類轉換為子類要 強制型別轉換;且在執行時若實際不是對應的物件,會丟擲ClassCastException執行時異常;