1. 程式人生 > >Java中強制型別轉換的實現機制

Java中強制型別轉換的實現機制

你已經知道把一種型別的值賦給另外型別的一個變數是相當常見的。如果這2種類型是相容的,那麼Java 將自動地進行轉換。然而,不是所有的型別都是相容的,因此,不是所有的型別轉換都是可以隱式實現的。例如,沒有將double 型轉換為byte 型的定義。要達到這個目的,你必須使用一個強制型別轉換,它能完成兩個不相容的型別之間的顯式變換。讓我 們看看自動型別轉換和強制型別轉換。

Java 的自動轉換

如果下列2個條件都能滿足,那麼將一種型別的資料賦給另外一種型別變數時,將執行自動型別轉換(automatic type conversion):

    1.這2種類型是相容的。

    2.目的型別數的範圍比來源型別的大。

當以上2個條件都滿足時,拓寬轉換(widening conversion )發生。例如,int 型的範圍比所有byte 型的合法範圍大,因此不要求顯式強制型別轉換語句。

對於拓寬轉換,數字型別,包括整數(integer )和浮點(floating-point )型別都是彼此相容的,但是,數字型別和字元型別(char)或布林型別(bollean )是不相容的。字元型別(char )和布林型別(bollean )也是互相不相容的。

不相容型別的強制轉換

儘管自動型別轉換是很有幫助的,但並不能滿足所有的程式設計需要。例如,如果你需要將int型的值賦給一個byte 型的變數,你將怎麼辦?這種轉換不會自動進行,因為byte 型的變化範圍比int 型的要小。這種轉換有時稱為“縮小轉換”,因為你肯定要將源資料型別的值變小才能適合目標資料型別。

為了完成兩種不相容型別之間的轉換,你就必須進行強制型別轉換。所謂強制型別轉換隻不過是一種顯式的型別變換。它的通用格式如下:

(target-type)value

其中,目標型別(target-type )指定了要將指定值轉換成的型別。例如,下面的程式段將int 型強制轉換成byte 型。如果整數的值超出了byte 型的取值範圍,它的值將會因為對byte 型值域取模(整數除以byte 得到的餘數)而減少。(其中int型的值域為2^32,而long型的值域為2^64)

int a;

byte b;

// ...

b = (byte) a;

當把浮點值賦給整數型別時一種不同的型別轉換髮生了:截斷(truncation )。你知道整數沒有小數部分。這樣,當把浮點值賦給整數型別時,它的小數部分會被捨去。例如,如果將值1.23賦給一個整數,其結果值只是1,0.23 被丟棄了。當然,如果浮點值太大而不能適合目標整數型別,那麼它的值將會因為對目標型別值域取模而減少。from: http://www.360doc.com/content/14/0911/13/12146850_408639797.shtml