| |
9-4 類別的多形性運用
內容:
9-4-1 何謂多形性
繼承性裡有一個重要的特點,子類別與父類別所宣告的成員(變數或方法)名稱相同時,兩者還是各自獨立的,並沒有真正被覆蓋掉。
如果同一類別內宣告相同名稱的成員(變數或方法),那又是如何?這也是物件導向另一個特點。基本上,同一類別內變數名稱(或方法名稱)是不可以被重複宣告使用的,但對於相同名稱但資料型態不同者,是被允許的。因為名稱相同但資料型不同的變數之間是各自獨立的。另一方面,名稱相同但輸入/輸出引數不同的方法成員之間也是各自獨立的。許多實際應用環境需要這種特性,譬如,加法運算器大多允許各種資料型態的運算,如果不同資料型態需引用不同的加法器,可能會產生很困擾。但話說回來,電腦在處理各種運算時,的確需考慮是何種資料型態,才可以做運算工作,這又是如何?其實很簡單,吾人製作了許多不同資料型態的加法器,但都採用相同名稱;當系統操作時,依照所欲處理的資料型態再引用哪一個加法器。簡單的說,同一種變數(或方法)名稱,可引用多種資料型態的處理(各自不同的處理器),這就是類別的『多形性』。
9-4-2 範例研討:多功能加法器
(A) 程式範例:Ex9_4.java
請製作一個加法器功能是,允許:
-
整數 +
整數 =
整數;
-
整數 +
浮點數 =
浮點數;
-
浮點數 +
整數 =
浮點數;
-
浮點數 +
浮點數 =
浮點數;
等 4
種運算處理。當呼叫該加法器時,他會依照所欲處理資料的型態,決定處理方式。請製作完成之後,再編寫一主程式呼叫該工具,觀察是否執行正常;期望操作介面如下:
|
G:\Examples\chap12\Ex9_3>javac
Arith.java
G:\Examples\chap12\Ex9_3>javac Ex9_3.java
G:\Examples\chap12\Ex9_3>java Ex9_3
整數
+
整數
=
整數
Arith.Add(5, 5) = 10
浮點數
+
整數
=
浮點數
Arith.Add(2.9, 5) = 7.90
整數
+
浮點數
=
浮點數
Arith.Add(5, 2.9) = 7.90
浮點數
+
浮點數
=
浮點數
Arith.Add(2.9, 2.9) = 5.80 |
(B)製作技巧研討:Arith.java
吾人利用 Arith 類別製作了多功能加法器(靜態方法),程式範例如下:(如圖 9-9 所示)

圖 9-9 Arith 類別架構
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21 |
//Arith.java
class Arith {
static int Add(int x, int y) {
System.out.printf("整數
+
整數
=
整數\n");
return (x+y);
}
static double Add(double x, int y) {
System.out.printf("浮點數
+
整數
=
浮點數\n");
return (x+y);
}
static double Add(int x, double y) {
System.out.printf("整數
+
浮點數
=
浮點數\n");
return (x+y);
}
static double Add(double x, double y) {
System.out.printf("浮點數
+
浮點數
=
浮點數\n");
return (x+y);
}
} |
(C) 程式範例:Ex9_3.java
Ex9_3.java 程式裡引用 Arith.Add() 類別方法,它會依照不同的輸入資料型態,選擇執行哪一個函數,程式範例如下:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15 |
//Ex9_3.java
/* Arith.class
需於同目錄下
*/
public class Ex9_3 {
public static void main(String args[]) {
int a=5;
double b=2.9;
System.out.printf("\tArith.Add(5, 5) = %d\n",
Arith.Add(a, a));
System.out.printf("\tArith.Add(2.9, 5) = %.2f\n",
Arith.Add(b, a));
System.out.printf("\tArith.Add(5, 2.9) = %.2f\n",
Arith.Add(a, b));
System.out.printf("\tArith.Add(2.9, 2.9) = %.2f\n",
Arith.Add(b, b));
}
} |
9-4-3 自我挑戰:多功能大小比較器
(A)程式功能:PM9_3
請製作一套多功能比較器,功能是允許輸入 2 ~ 5 個數字(浮點數運算),再輸出其中最大值與最小值。請先製作一個比較器(Max() 或 Min())類別,可隨輸入參數數量,決定執行哪一個方法。主程式(PM9_3.java)再引用該方法,測試執行結果是否正常。期望操作介面如下:
|
G:\Examples\chap12\PM9_3>java PM9_3
請輸入兩個數
(如:
34 45.2) =>42.7 98.6
最大值
= 98.60,
最小值
= 42.70
請輸入
3
個數
=>23.8 78 12.6
最大值
= 78.00,
最小值
= 12.60
請輸入
4
個數
=>44.6 31 67 25.9
最大值
= 67.00,
最小值
= 25.90
請輸入
5
個數
=>78.9 45.2 72.6 41 73.5
最大值
= 78.90,
最小值
= 41.00 |
(B)製作技巧提示:MaxMin.java
吾人可製作一個 MaxMin 類別,包含 Max() 與 Min() 類別方法,部分程式範例如下:(如圖 9-10 所示)

圖 9-10 MaxMin
類別架構
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
//MaxMin.java
class MaxMin {
/*
尋找最大值方法
*/
static double Max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
}
static double Max(double num1, double num2, double
num3) {
double num = Max(num1, num2);
if (num > num3)
return num;
else
return num3;
}
static double Max(double num1, double num2, double
num3,
double num4) {
double num = Max(num1, num2, num3);
…….
…….
}
static double Max(double num1, double num2, double
num3,
double num4, double num5) {
……..
……..
}
/*
尋找最小值方法
*/
static double Min(double num1, double num2) {
if (num1 < num2)
return num1;
else
return num2;
}
static double Min(double num1, double num2, double
num3) {
double num = Min(num1, num2);
if (num < num3)
return num;
else
return num3;
}
……(請自行編寫)
……
} |
(1)
第 12
行:『double num = Max(num1, num2);』。呼叫本類別的 Max( double double) 方法。
(2)
第 20
行:『double num = Max(num1, num2, num3);』呼叫本類別內的其他方法。
(C)製作技巧提示:PM9_3.java
完成 MaxMin 類別之後,即可製作一個主程式,測試其功能如何。重點提示如下:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
//PM9_3.java
/* MaxMin.class
需於同一目錄下
*/
import java.util.Scanner;
public class PM9_3 {
public static void main(String args[]) {
Scanner keyin = new Scanner(System.in);
double num1, num2, num3, num4, num5;
double max, min;
System.out.printf("請輸入兩個數
(如:
34 45.2) =>");
num1 = keyin.nextDouble();
num2 = keyin.nextDouble();
max = MaxMin.Max(num1, num2);
min = MaxMin.Min(num1, num2);
System.out.printf("最大值
= %.2f,
最小值
= %.2f\n", max, min);
System.out.printf("\n請輸入
3
個數
=>");
…..
…..
max = MaxMin.Max(num1, num2, num3);
min = MaxMin.Min(num1, num2, num3);
…..
…..
max = MaxMin.Max(num1, num2, num3, num4);
min = MaxMin.Min(num1, num2, num3, num4);
……
……
}
} |
MaxMin.java 與 PM9_3.java 需於同目錄下,並經編譯(javac)得到 MaxMin.class 與 PM9_3.class 兩中介碼檔案。
|

翻轉工作室:粘添壽
Java 程式設計(二) 含物件導向
翻轉電子書系列:
|