Java/包裝類之道
對於 Java 中的每種基本型別,都存在一個稱為包裝類的內建物件型別。例如,int 的包裝類稱為 Integer;double 的包裝類稱為 Double。
包裝類很有用,原因有以下幾點:
每個包裝類都包含特殊值(如型別的最小值和最大值)以及用於在型別之間轉換的有用方法。
您可以例項化包裝類並建立包含基本值的物件。換句話說,您可以將基本值包裝到一個物件中,如果您想呼叫需要物件型別的方法,這將很有用。
建立包裝物件的最直接方法是使用它的建構函式
逐字
Integer i = new Integer (17);
Double d = new Double (3.14159);
Character c = new Character ('b');
逐字
從技術上講,String 不是包裝類,因為它沒有相應的基元型別,但建立 String 物件的語法相同
逐字
String s = new String ("fred");
逐字
另一方面,沒有人會使用 String 物件的建構函式,因為您可以透過簡單的 String 值獲得相同的效果
逐字
String s = "fred";
逐字
在我的開發環境中,Boolean 包裝類沒有正確實現。應該有一個接收基元 boolean 作為引數的建構函式,但以下程式碼
逐字
Boolean b = new Boolean (true);
逐字
會產生錯誤。
一些包裝類具有第二個建構函式,該建構函式接收 String 作為引數並嘗試轉換為適當的型別。例如
逐字
Integer i = new Integer ("17");
Double d = new Double ("3.14159");
逐字
應該有一個接收 String 引數的 Boolean 建構函式,但它在我的開發環境中沒有實現。對於 Characters 沒有這樣的建構函式。
型別轉換過程不是很健壯。例如,如果字串格式不正確,它們將導致 NumberFormatException。字串中的任何非數字字元,包括空格,都會導致轉換失敗。
逐字
Integer i = new Integer ("17.1"); // WRONG!!
Double d = new Double ("3.1459 "); // WRONG!!
逐字
在嘗試轉換之前,通常最好檢查字串的格式。
令人討厭的是,還有一種建立包裝物件的方法,使用包裝類中的類方法。
逐字
Integer i = Integer.valueOf ("17");
Double d = Double.valueOf ("3.14159");
逐字
這些方法使用與建構函式相同的轉換方法(parseInt 和 parseDouble),因此它們沒有更健壯。
當有兩種方法可以做同一件事時,最好選擇一種並始終如一地堅持使用。在本例中,我認為使用建構函式比使用 valueOf 好得多,因為它更清楚地表明您正在建立新的包裝物件。valueOf 的名字選得不好;鑑於這個名字,它完全不清楚它的作用。
Java 知道如何列印包裝物件,因此提取值的最簡單方法就是列印該物件
逐字
Integer i = new Integer (17);
Double d = new Double (3.14159);
System.out.println (i);
System.out.println (d);
逐字
或者,您可以使用 toString 方法將包裝物件的內容轉換為字串
逐字
String istring = i.toString();
String dstring = d.toString();
逐字
最後,如果您只是想從物件中提取基本值,每個包裝類中都有一個物件方法可以完成這項工作
逐字
int iprime = i.intValue ();
double dprime = d.doubleValue ();
逐字
還有一些方法可以將包裝類轉換為不同的基元型別。
正如我提到的,包裝類包含與每個型別相關的有用方法。例如,Integer 包含用於解釋和以不同基數列印整數的方法。如果您有一個包含以 6 進製表示的數字的字串,可以使用 parseInt 轉換為 10 進位制。
逐字
String base6 = "12345";
int base10 = Integer.parseInt (base6, 6);
System.out.println (base10);
逐字
由於 parseInt 是一個類方法,因此您透過以點表示法命名類和方法來呼叫它。
6 進位制可能不是那麼有用,但十六進位制(16 進位制)和八進位制(8 進位制)在計算機科學相關的事情中很常見。
在 Character 類中,有很多方法可以將字元轉換為大寫和小寫,以及檢查字元是否為數字、字母或符號。