|
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 程式設計(二) 含物件導向
翻轉電子書系列:
|