Javaで抽象クラスとインターフェースの合わせ技

概要

人間の振る舞いをするメソッドを持つ学生クラスと学生クラスを継承する大学生クラスと高校生クラスを作る。このオブジェクトが通う学校クラスも作り、学生と学校との間でのやりとりを確認する。メソッドの動的結合を使う。

interface Study {
    public void study();
}

interface Human {
    public void talk();

    public void walk();

    public void run();
}

abstract class Student implements Study, Human {
    public void talk() {
        System.out.println("おしゃべりする");
    }

    public void walk() {
        System.out.println("歩く");
    }

    public void run() {
        System.out.println("走る");
    }

    public void study() {
        System.out.println("勉強する");
        ;
    }

    public abstract void response();
}

class UniversityStudent extends Student {
    public void study() {
        System.out.println("教養を身につける");
    }

    public void response() {
        System.out.println("単位取得に出席は関係ありません");
    }

    @Override
    public String toString() {
        return "大学生";
    }
}

class highschoolStudent extends Student {
    public void study() {
        System.out.println("まずは暗記が必要です");
    }

    public void response() {
        System.out.println("単位習得に出席が必要です");
    }

    @Override
    public String toString() {
        return "高校生";
    }
}

class School_1 {
    public School_1(String name) {
        System.out.println("[" + name + "]オブジェクトを生成しました。");
    }

    public void callTheRoll(Student st) {
        System.out.println("[" + st + "]の出席を取ります。よろしいですか。");
        st.response();
    }
}

public class StudentTest {
    public static void main(String[] args) {
        UniversityStudent us = new UniversityStudent();
        highschoolStudent hs = new highschoolStudent();
        System.out.println();

        School_1 TokyoUniv = new School_1("東京大学");
        School_1 AzabuHighSchool = new School_1("麻布高校");
        System.out.println();

        System.out.println("大学生の特徴");
        us.walk();
        us.run();
        us.study();
        System.out.println();

        System.out.println("高校生の特徴");
        hs.walk();
        hs.run();
        hs.study();
        System.out.println();

        System.out.println("学校で出席を取ります");
        TokyoUniv.callTheRoll(us);
        AzabuHighSchool.callTheRoll(hs);
    }
}

実行結果

[東京大学]オブジェクトを生成しました。
[麻布高校]オブジェクトを生成しました。

大学生の特徴
歩く
走る
教養を身につける

高校生の特徴
歩く
走る
まずは暗記が必要です

学校で出席を取ります
[大学生]の出席を取ります。よろしいですか。
単位取得に出席は関係ありません
[高校生]の出席を取ります。よろしいですか。
単位習得に出席が必要です

「謎」の進学校 麻布の教え (集英社新書)

「謎」の進学校 麻布の教え (集英社新書)

東京大学のアルバート・アイラー : 東大ジャズ講義録・歴史編

東京大学のアルバート・アイラー : 東大ジャズ講義録・歴史編