Java 入門指南
單元 8 - 類別
Java 中一個類別 (class) 就是一個程式檔案,類別名稱要跟檔案名稱相同。典型的類別定義,如下圖
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) ,我們將 ClassDemo01 的 doSomething() 改成多載版本,如下
/*
* 檔名: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();
}
}
ClassDemo02 的 doSomething() 有兩個版本
// 這裡定義 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 + p1 的 a 會先轉換成 double ,然後才與 p1 相加。
此例很簡單,兩個參數列都只有一個參數,差異僅在型態不同而已。執行結果如下
16 |
18.2 |
接下來,我們開始介紹物件導向程式設計 (object-oriented programming) 的特性 封裝 (encapsulation) 。
相關教學影片
中英文術語對照 | |
---|---|
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. 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 。 |