Java 入門指南

單元 8 - 類別

~~學習進度表~~

Java 中一個類別 (class) 就是一個程式檔案,類別名稱要跟檔案名稱相同。典型的類別定義,如下圖

public class DemoType {
    field_type field;
    
    public return_type method(parameter_list) {
        ...
    }
}

整體結構就是宣告類別,類別名稱之後用一對大括弧把定義圍起來,裡頭可以定義屬性 (field) 與方法 (method) ,屬性就是專屬於類別的變數 (variable) ,方法則是類別進行工作的地方。如果這個類別還需要是可執行的,就得額外定義特別的 main() 方法。我們將上面的定義例子寫成完整的範例程式,如下

/*
 * 檔名:ClassDemo01.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
package classdemo01;

// 宣告類別名稱
public class ClassDemo01 {
    // 這裡定義屬性
    int a;
    
    // 這裡定義方法
    public int doSomething(int p1) {
        return a + p1;
    }
    
    // 這裡定義 main() 方法
    public static void main(String[] args) {
        ClassDemo01 d = new ClassDemo01();
        d.a = 11;
        System.out.println();
        System.out.println(d.doSomething(5));
        System.out.println();
    }
}

記不記得之前完整範例中都有 main() ,先來執行這個範例程式,看看執行出什麼結果囉

16

程式的執行在 main() 方法的定義地方

// 這裡定義 main() 方法
public static void main(String[] args) {
    ClassDemo01 d = new ClassDemo01();
    d.a = 11;
    System.out.println();
    System.out.println(d.doSomething(5));
    System.out.println();
}

我們在 main() 中宣告並建立相同 ClassDemo01 型態的物件 d ,為什麼可以這樣做呢?為什麼可以在 main() 中建立相同類別的物件 (object) ?答案很簡單,這是因為 static 的關係。由於屬性及方法合稱成員 (member) ,類別中的成員有兩種,一種用 static 修飾, static 成員屬於類別,另一種沒有用 static 修飾,這一類成員屬於物件實體 (instance) 。

ClassDemo01 中, a 為實體屬性 (instance field) , doSomething() 是實體方法 (instance method) ,而 main() 則是類別方法 (class method) 。實體成員與類別成員兩者最大的不同就是互相不能直接存取對方,如果要在 main() 中使用 a ,那就得在 main() 裡建立 ClassDemo01 型態的物件實體。

此例在 main() 中建立 ClassDemo01 的實體變數 d ,然後將 d 的屬性 a 設置為 11

ClassDemo01 d = new ClassDemo01();
d.a = 11;

然後呼叫 doSomething() 方法

System.out.println(d.doSomething(5));

接著我們往上找實體屬性 a 的宣告

// 這裡定義屬性
int a;

通常屬性的宣告會放在 class 關鍵字 (keyword) 的下一行,數量依需求而定。

定義 doSomething() 的部分

// 這裡定義方法
public int doSomething(int p1) {
    return a + p1;
}

此例的 doSomething() 需要一個 int 參數 (parameter) p1 ,結果回傳一個 int 整數。小括弧裡頭放參數,稱之為參數列 (parameter list) ,因為參數的數量也可依需求而定。

Java 允許方法可以有不同的參數列版本,這稱之為多載 (overload) ,我們將 ClassDemo01doSomething() 改成多載版本,如下

/*
 * 檔名:ClassDemo02.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
package classdemo02;

public class ClassDemo02 {
    int a;
    
    // 這裡定義 doSomething() 的第一個版本
    public int doSomething(int p1) {
        return a + p1;
    }
    
    // 這裡定義 doSomething() 的第二個版本
    public double doSomething(double p1) {
        return a + p1;
    }
    
    public static void main(String[] args) {
        ClassDemo02 d = new ClassDemo02();
        d.a = 11;
        
        System.out.println();
        System.out.println(d.doSomething(5));
        System.out.println(d.doSomething(7.2));
        System.out.println();
    }
}

ClassDemo02doSomething() 有兩個版本

// 這裡定義 doSomething() 的第一個版本
public int doSomething(int p1) {
    return a + p1;
}
    
// 這裡定義 doSomething() 的第二個版本
public double doSomething(double p1) {
    return a + p1;
}

第一個 doSomething() 用了 int 的參數 p1 ,第二個 doSomething() 的參數型態則是 double ,兩者構成不同的多載版本。

回傳值型態 (return type) 並不影響多載的版本差異,只有參數列不同才構成多載,至於參數列指參數的型態、數量、排列順序等。

如果運算式中的兩個數值 (value) 都是基本資料型態 (primitive data type) ,編譯器 (compiler) 會自動替其中一個數值先進行型態轉換,如上面第二個 doSomething()a + p1a 會先轉換成 double ,然後才與 p1 相加。

此例很簡單,兩個參數列都只有一個參數,差異僅在型態不同而已。執行結果如下

16
18.2

接下來,我們開始介紹物件導向程式設計 (object-oriented programming) 的特性             封裝 (encapsulation) 。

相關教學影片

上一頁 單元 7 - 迴圈
回 Java 入門指南首頁
下一頁 單元 9 - 封裝與建構子
回 Java 教材首頁
回程式語言教材首頁
中英文術語對照
class類別
class method類別方法
compiler編譯器
encapsulation封裝
field屬性
instance實體
instance field實體屬性
instance method實體方法
keyword關鍵字
member成員
method方法
object物件
object-oriented programming物件導向程式設計
overload多載
parameter參數
parameter list參數列
primitive data type基本資料型態
return type回傳值型態
value數值
variable變數
參考資料
1. The Java™ Tutorials: What Is an Object?
2. The Java™ Tutorials: What Is a Class?
3. The Java™ Tutorials: Lesson: Classes and Objects
4. The Java™ Tutorials: Classes
5. The Java™ Tutorials: Declaring Classes
6. The Java™ Tutorials: Declaring Member Variables
7. The Java™ Tutorials: Defining Methods
8. The Java™ Tutorials: Objects
9. The Java™ Tutorials: Creating Objects
10. The Java™ Tutorials: Using Objects
重點整理
1. Java 中一個類別就是一個程式檔案,類別名稱要跟檔案名稱相同。
2. 類別定義包括宣告屬性與定義方法,屬性是類別中共通的變數,方法進行工作。
3. 關鍵字 static 宣告的成員屬於類別,其他非 static 定義的內容屬於物件實體。
4. 多載是指方法可以有不同的參數列版本。
問題與討論
1. 為什麼類別要有欄位跟方法?想一想,這跟物件的意涵有什麼關聯?
2. 為什麼方法有參數列?回傳值的目的是什麼?
3. 什麼是多載?為什麼方法允許有不同的參數列版本?
4. 為什麼要有關鍵字 static ?類別與實體有有何不同?
練習
1. 建立一個專案 Exercise0801 ,裡頭設計一個 int 的屬性 result ,另有一個沒有回傳值的方法 add()add() 有一個 int 參數,呼叫 add() 時會把參數與 result 相加,結果儲存在 result ,執行部分先將 result 設定為 25 ,再呼叫 add()24 當參數。
2. 承上題,另建立一個專案 Exercise0802 ,改成由使用者輸入兩個整數。
3. 承上題,另建立一個專案 Exercise0803 ,加入方法 subtract()subtract() 沒有回傳值,另外需要一個 int 參數,同樣呼叫 subtract() 是將 value 減去參數值,最後結果儲存在 result
4. 承上題,另建立一個專案 Exercise0804 ,繼續擴充 Exercise0803 ,加入乘法的方法。
5. 承上題,另建立一個專案 Exercise0805 ,繼續擴充 Exercise0804 ,加入除法的方法。
6. 建立一個專案 Exercise0806 ,仿照 Exercise0709 ,將方法改成計算階層值,結果儲存在 result
7. 寫一個程式 Exercise0807 ,仿照 Exercise0711 ,將方法改成計算費氏數列,結果儲存在 result