學習目標: 多型 繼承
--多型--
撰寫一個 Human 類別 代表人
在這裡我們有兩個衍伸類別 Man 與 Woman
他們用不同的規則活著:
Man : 吃飯時 印出"好好吃" 睡覺時 印出"zzz"
Woman: 吃飯時 印出"Orzz" 睡覺時 印出":)"
(印出代表用System.our.println(...))
使用者會輸入一個字串 代表 男人與女人 的順序 ( b -> 男 g -> 女 大小寫皆可)
像是: bgGGBgb 代表 男人有3位 女人有4位 照這個順序排列 (左到右)
之後照著順序印出所有人 吃飯 及 睡覺 的情況
需使用多型
沒頭緒的話就讀熟多型的章節
Example
Input
bgGGBgb
output
輸入字串:
bgGGBgb
好好吃
Orzz
Orzz
Orzz
好好吃
Orzz
好好吃
zzz
:)
:)
:)
zzz
:)
zzz
public abstract class Human {
abstract String eating();
abstract String sleeping();
}
class Man extends Human {
@Override
String eating() {
return "好好吃";
}
@Override
String sleeping() {
return "zzz";
}
}
class Woman extends Human {
@Override
String eating() {
return "Orzz";
}
@Override
String sleeping() {
return ":)";
}
}
mport java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;
public abstract class Human {
abstract String eating();
abstract String sleeping();
public static void main(String[] args) {
System.out.println("請輸入一個字串 代表 男人與女人 的順序 ( b -> 男 g -> 女 大小寫皆可)\n" +
"像是: bgGGBgb 代表 男人有3位 女人有4位 照這個順序排列 (左到右)");
// 取得使用者的輸入
Scanner scanner = new Scanner(System.in);
// 將取得的字串轉英文小寫
String bgString = scanner.next().toLowerCase(Locale.ROOT);
printHumanRoutine(bgString);
}
/**
* 照著順序印出所有人 吃飯 及 睡覺 的情況
* @param bgString
*/
public static void printHumanRoutine(String bgString) {
List<Human> humanList = new ArrayList<>();
// 遍歷字串將男人或女人放入human集合
for (int i = 0; i < bgString.length(); i++) {
String str = bgString.charAt(i) + "";
Human human = null;
if ("b".equals(str)) {
human = new Man();
} else if ("g".equals(str)) {
human = new Woman();
}
System.out.println(human.eating());
humanList.add(human);
}
for (int i = 0; i < humanList.size(); i++) {
Human human = humanList.get(i);
System.out.println(human.sleeping());
}
}
}
最後我覺得 水球潘 對於這個範例的解釋太好了,所以我決定放在這裡讓這個觀念好好住在心裡:)
在這邊 男人跟女人 是 具體的子類別
因為很清楚 這是男人 這是女人 所以稱為"具體"
那人類呢? 人類具體嗎? Human 你不知道他是哪種人
因此稱之為 "抽象",抽象的類別 就不該把具體的內容打清楚
所以在定義Human的函數時 會不知道要打什麼內容
抽象類別是不可以被new的 因為他是抽象的
抽象類別 可以定義抽象方法 就是只跟程式說
人類會吃飯 會睡覺 但我不說清楚其具體內容
你必須告訴我你是哪個具體子類別 我才知道你 在睡覺跟吃飯時要做什麼