Java SE 6 技術手冊

4.1 關於物件

基本型態 long、int、double、float、boolean 等,在 J2SE 5.0 之前必須親自使用 Long、Integer、Double、Float、Boolean 等類別將之包裹為物件,如此才能將之當作物件來操作,即使 J2SE 5.0 開始支援了自動裝箱(autoboxing)、拆箱(unboxing),您仍然有必要瞭解如何親自包裹基本型態,這有助於您瞭解物件與基本型態的差別。

4.1.1 使用物件

在 Java 中會經常談到「類別」(Class)與「物件」(Object)這兩個名詞,要詳細談這兩個名詞的差別,就要詳細討論物件導向程式設計的內容,這邊先給您簡單的解釋:「類別就像是物件的設計圖,它定義了物件可操作的功能。」

不以 Java 的術語而以白話來說明的話,物件就像是一件具體的工具,而類別定義了這個工具如何產生。例如您有一張剪刀的設計圖,並依這張設計圖製作了一隻剪刀,則設計圖就類似於我所說的類別,而製作出來的剪刀就類似於我說的工具。

在正式開始學會 Java 物件導向程式設計之前,您要先學會如何使用 J2SE 所提供的一系列標準工具(也就是標準物件),您指明所要使用的設計圖(也就是類別)來產生具體的工具(也就是物件),工具的設計圖內容實際為何您不用擔心,您所要作的就是操作這些工具並配合第 3 章中介紹的流程控制語法,以完成您所需的程式。

舉個簡單的例子,如果您想寫一個程式取得現在的系統時間,您只要產生一個 java.util.Date 工具就可以了,至於 Date 實際上如何向系統取得時間,則無需您來操心,範例 4.1 示範如何取得系統時間。

範例 4.1 NowTime.java

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 展現幾個簡單的字串操作。

範例 4.2 StringDemo.java

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() 方法。

範例 4.3 UserLogin.java

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 物件實際上如何取得輸入,物件本身包括了如何取得資訊方式,但對您隱藏這些資訊,您只要透過它所提供的方法,就可以完成相對應的操作。

4.1.2 包裹(Wrap)基本型態

回過頭來看看基本型態: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 來瞭解體會。

範例 4.4 WrapperDemo.java

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 上的一個示範畫面如下:

Eclipse 上的物件方法提示

圖 4.1 Eclipse 上的物件方法提示