基本型態 long、int、double、float、boolean 等,在 J2SE 5.0 之前必須親自使用 Long、Integer、Double、Float、Boolean 等類別將之包裹為物件,如此才能將之當作物件來操作,即使 J2SE 5.0 開始支援了自動裝箱(autoboxing)、拆箱(unboxing),您仍然有必要瞭解如何親自包裹基本型態,這有助於您瞭解物件與基本型態的差別。
在 Java 中會經常談到「類別」(Class)與「物件」(Object)這兩個名詞,要詳細談這兩個名詞的差別,就要詳細討論物件導向程式設計的內容,這邊先給您簡單的解釋:「類別就像是物件的設計圖,它定義了物件可操作的功能。」
不以 Java 的術語而以白話來說明的話,物件就像是一件具體的工具,而類別定義了這個工具如何產生。例如您有一張剪刀的設計圖,並依這張設計圖製作了一隻剪刀,則設計圖就類似於我所說的類別,而製作出來的剪刀就類似於我說的工具。
在正式開始學會 Java 物件導向程式設計之前,您要先學會如何使用 J2SE 所提供的一系列標準工具(也就是標準物件),您指明所要使用的設計圖(也就是類別)來產生具體的工具(也就是物件),工具的設計圖內容實際為何您不用擔心,您所要作的就是操作這些工具並配合第 3 章中介紹的流程控制語法,以完成您所需的程式。
舉個簡單的例子,如果您想寫一個程式取得現在的系統時間,您只要產生一個 java.util.Date 工具就可以了,至於 Date 實際上如何向系統取得時間,則無需您來操心,範例 4.1 示範如何取得系統時間。
import java.util.Date;
public class NowTime {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.toString());
}
}
Date date 表示您指定的工具為 Date 類型,而參考名稱(reference name)為 "date";new Date() 表示您要程式產生這麼一個 Date 工具。您可以將參考名稱想像成一個名牌,它現在綁在一個 Date 工具上。在取得 Date 的實例(Instance)之後,您就可以透過參考名稱來操作它。這就好比公司員工身上會有個"跑腿"名牌,名牌掛在哪個員工身上,透過"跑腿"名牌呼叫時,有名牌的那個員工就要跑腿。
範例 4.1 中操作 toString() 方法,要求 Date 的實例產生目前的系統時間,然後您將之輸出在文字模式下(有關 Date 操作的詳細說明,請見 18 章),執行結果如下:
Tue May 03 16:06:46 GMT+08:00 2005
另一個操作物件最顯而易見的就是字串的操作,在 Java 中字串就是物件,是 java.lang.String 類別的一個實例,我會在第 6 章詳細介紹字串的特性,在這邊我先以範例 4.2 展現幾個簡單的字串操作。
public class StringDemo {
public static void main(String[] args) {
String text = "Have a nice day!! :)";
System.out.println("原文:" + text);
// 傳回全為大寫的字串內容
System.out.println("大寫:" + text.toUpperCase());
// 轉回全為小寫的字串內容
System.out.println("小寫:" + text.toLowerCase());
// 計算字串長度
System.out.println("長度:" + text.length());
// 傳回取代文字後的字串
System.out.println("取代:" + text.replaceAll("nice", "good"));
// 傳回指定位置後的子字串
System.out.println("子字串:" + text.substring(5));
}
}
在程式中的每一個陳述都已經說明了每個方法的作用,直接來看執行的結果:
原文:Have a nice day!! :)
大寫:HAVE A NICE DAY!! :)
小寫:have a nice day!! :)
長度:20
取代:Have a good day!! :)
子字串:a nice day!! :)
在 Java 中直接使用 "" 包括的字串就是一個物件,範例 4.3 展現了一個簡單的使用者登入程式,運用了 String 物件的 equals() 方法。
import java.util.Scanner;
public class UserLogin {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("使用者名稱:");
String username = scanner.next();
System.out.print("使用者密碼:");
String password = scanner.next();
if("caterpillar".equals(username)
&& "1975".equals(password)) {
System.out.println("秘密資訊在此!");
}
else {
System.out.println(username +
" 您好,輸入的登入資料有誤,請重新輸入!");
}
}
}
String 物件的 equals() 方法可以用來比對指定的字串是否有相同的字元內容,如果相同就傳回 true,不然就傳回 false,以下是執行的結果:
使用者名稱:caterpillar
使用者密碼:1975
秘密資訊在此!
在範例 4.3 中,您還使用了 Scanner 物件來協助您取得使用者字串的輸入,雖然您並不知道 Scanner 物件實際上如何取得輸入,物件本身包括了如何取得資訊方式,但對您隱藏這些資訊,您只要透過它所提供的方法,就可以完成相對應的操作。
回過頭來看看基本型態:long、int、double、float、boolean、byte 等。在 Java 中這些並不是物件,它只是純綷的資料,除了數值本身的資訊之外,基本型態不帶有其它的資訊或可操作的方法。
您已經看過幾個操作物件的範例,也知道使用物件的好處,物件本身可以攜帶更多的資訊,所以如果基本型態可以物件的形式存在,它可以帶有更多的訊息並提供相對應的操作方法,在 J2SE 5.0 之前,如果您想要讓基本型態能像物件一樣操作,那麼您要使用 Long、Integer、Double、Float、Boolean、Byte 等類別來包裹(Wrap)基本型態。 Long、Integer、Double、Float、Boolean 等類別是所謂的 Wrapper 類別,正如其名稱所表示的,這些類別的主要目的,就是讓您提供一個物件實例作為「殼」,將基本型態包到這個物件之中,如此您就可以操作這個物件,就好像您將基本型態當作物件一樣操作,您可以直接看看範例 4.4 來瞭解體會。
public class WrapperDemo {
public static void main(String[] args) {
int data1 = 10;
int data2 = 20;
// 使用Integer來包裏int資料
Integer data1Wrapper = new Integer(data1);
Integer data2Wrapper = new Integer(data2);
// 直接除以3
System.out.println(data1 / 3);
// 轉為double值再除以3
System.out.println(data1Wrapper.doubleValue() / 3);
// 進行兩個值的比較
System.out.println(data1Wrapper.compareTo(data2Wrapper));
}
}
在第 2 章中有提到過,如果您將兩個整數進行相除,預設上會將小數點後的資料去除,而在範例 4.4 中,您將整數使用 Integer 包裹,並使用它的 doubleValue() 傳回 double 值,如此再進行相除時小數點後就不會被去除,而 Integer 上也提供 compareTo() 可以直接比較與另一個 Integer 物件是否相等,如果是就傳回 0,比指定值小的話傳回 -1,比指定值大的話傳回 1,與使用 '==' 只能比較是否相同,compareTo() 方法傳回更多的資訊,執行的結果如下:
3
3.3333333333333335
-1
依照同樣的方式,您也可以將 long、double、float、boolean、byte 等,使用對應的 Long、Double、Float、Boolean、Byte 等類別進行包裹,之後就可以進行物件操作。
良葛格的話匣子 在 IDE 上撰寫程式的話,資料以物件方式存在也可以提高寫程式的效率,因為大部份的 IDE 對物件都會提示可使用的方法,如此在選取物件方法時會很有幫助,例如在 Eclipse 上的一個示範畫面如下:
圖 4.1 Eclipse 上的物件方法提示