Java - 多型 繼承

By sunwc 2023-03-16 Practice
學習目標: 多型 繼承

--多型--

撰寫一個 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

題目來源

  • 建立Human抽象類別
public abstract class Human {

    abstract String eating();
    abstract String sleeping();
}
  • 建立男人類別繼承Human
class Man extends Human {

    @Override
    String eating() {
        return "好好吃";
    }

    @Override
    String sleeping() {
        return "zzz";
    }
}
  • 建立女人類別繼承Human
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的 因為他是抽象的
抽象類別 可以定義抽象方法 就是只跟程式說
人類會吃飯 會睡覺 但我不說清楚其具體內容
你必須告訴我你是哪個具體子類別 我才知道你 在睡覺跟吃飯時要做什麼

參考來源