在 Java 中強制轉換變數
本教程介紹如何在 Java 中強制轉換變數或將變數轉換為另一種型別。
轉換用於在程式語言中將一個值/變數轉換/轉換為另一種型別。Java 支援豐富的資料型別,如 int
、float
、double
、boolean
等,在編寫程式碼時,可能需要轉換變數。
Java 支援兩種型別的轉換,隱式轉換和顯式轉換。如果我們將 int
轉換為 long
或 double
,那麼 Java 會隱式執行此操作,因為 long
和 double
使用的位元組數比 int
多,我們會執行相反的操作(即,將 double
轉換為 int
) 那麼它可能會由於整數容量而導致資料丟失。
因此,Java 允許在較低資料型別到較高資料型別之間進行隱式轉換,但在較高資料型別到較低資料型別之間進行顯式轉換。讓我們通過一些例子來理解。
Java 中的隱式轉換
在這裡,在這個例子中,我們將 int
轉換為 float
型別,隱式轉換。由於 Java 允許在沒有太多程式碼的情況下進行隱式轉換,因此該程式碼可以正常工作。
public class SimpleTesting {
public static void main(String[] args) {
int a = 23;
System.out.println("int " + a);
// int to float - implicit casting
float f = a;
System.out.println("float " + f);
}
}
輸出:
int 23
float 23.0
Java 中的顯式轉換
在某些情況下,由於資料丟失,Java 確實需要顯式轉換。
例如,如果我們將 float
轉換為 int
,那麼小數點後的值會被截斷;這就是 Java 不隱式執行此操作並引發編譯時錯誤的原因。請參見下面的示例。
public class SimpleTesting {
public static void main(String[] args) {
float a = 23;
System.out.println("float " + a);
// float to int - explicit casting
int f = a;
System.out.println("int " + f);
}
}
輸出:
Type mismatch: cannot convert from float to int
這個編譯時錯誤是對程式設計師的警告,以避免這種資料丟失。如果程式設計師仍想進行型別轉換,Java 允許使用型別名稱將型別名稱括在函式括號中的型別轉換運算子。
此編譯器編譯並執行程式碼,但看到值被截斷。請參見下面的示例。
public class SimpleTesting {
public static void main(String[] args) {
float a = 23.5f;
System.out.println("float " + a);
// float to int - explicit casting
int f = (int) a;
System.out.println("int " + f);
}
}
輸出:
float 23.50
int 23
我們還可以使用 cast()
方法將物件值轉換為原始值。請參見下面的示例。
public class SimpleTesting {
public static void main(String[] args) {
Integer a = 23;
System.out.println("integer " + a);
// float to int - explicit casting
int i = (Integer.class.cast(a));
System.out.println("int " + i);
}
}
輸出:
integer 23
int 23
在 Java 中避免 CastException
轉換 Java 物件也是一個主要問題,在轉換之前需要正確的類型別。例如,如果我們用 double
強制轉換 float
型別,Java 不允許這樣做並將 ClassCastException
丟擲到控制檯。
請參見下面的示例。
public class SimpleTesting {
public static void main(String[] args) {
Number num = new Float(15.5);
System.out.println(num);
Double d = (Double) num;
System.out.println(d);
}
}
輸出:
15.5
Exception in thread "main" java.lang.ClassCastException