Java 抽象

抽象/具象クラスの定義

抽象とは、着目すべき対象を具体的なモノから概念に切り替えること
継承と同じようにanimalクラス(親)を継承した子クラスhuman,catクラスという関係性を作る。
今回はabstractが追加されるので抽象クラス、抽象メソッドが要素として考慮する必要がある

まず、継承元abstractとしてanimalクラスを作り、抽象メソッドのcryと具象メソッドのjumpを定義します
抽象メソッドのcryは振る舞いが違うので抽象元で処理を記述する必要はなく、実際の振る舞いは継承先のクラスに記述します
継承先は継承された抽象メソッドを必ず使わなければならない

//継承元animalクラスにはcry,jumpメソッドを作成してる
//抽象メソッドを定義するにはクラスにabstaractをつける
public abstract class Animal{
    abstract public void cry();
//ジャンプは具象メソッドで定義
    public void jump() {
        System.out.println("30cm飛んだ!");
    }
}

次に、具象クラスのhumanクラスはanimalクラスを継承先とし、抽象cry,具象imaginationメソッドを作成します。振る舞いとして想像した、えーんをいれます。cryは継承元でabstractなので継承先で必ず実装しなければならない。また、jumpはオーバーライドせず継承元であるanimalクラスのjumpメソッドを使用し、animalクラスのcryをオーバーライドし、継承先として人間だけがもってる振る舞い(想像する)を実装します

//humanクラスはanimalクラスを継承してる
public class Human extends Animal { 
//humanクラス独自のメソッド
    public void imagination() {
        System.out.println("想像した");
    }

//animalクラスを見に行くとcryメソッドは抽象メソッドなので必ずオーバーライドする必要がある
//animalクラスの抽象メソッドであるcryメソッドをオーバーライドしてます
    @Override
    public void cry() {
        System.out.println("えーん");
    }

}

具象クラスのcatクラスはanimalクラスを継承先とし2メソッドともオーバーライドしてふるまいをかえています

//catクラスはanimalクラスを継承し、cry,jumpメソッドはanimalクラスにあり、それぞれ振る舞いが違うので継承先でオーバーライドする
public class Cat extends Animal {
//animalクラスを見に行くとcryメソッドは抽象メソッドなので必ずオーバーライドする必要があるので
//animalクラスの抽象メソッドであるcryメソッドをオーバーライドしてます
    @Override
    public void cry() {
        System.out.println("にゃーん");
    }


//抽象クラスであるanimalクラスを見に行くと具象クラスとしてjumpメソッドが実装されてるので
//animalクラスの具象メソッドであるjumpメソッドをオーバーライドしてます
    @Override
    public void jump() {
        System.out.println("1m飛んだ!");
    }
}

関係図

クラス 抽象/具象 メソッド 抽象/具象 説明 継承関係
animalクラス 抽象 cry 抽象 継承元
jump 具象 30cm飛んだ 継承元
humanクラス 具象 imagination 具象 想像を働かせた 継承先
cry 抽象 えーん オーバーライド
catクラス 具象 jump 具象 1m飛ぶ オーバーライド
cry 抽象 にゃーん オーバーライド

Mainクラス

定義した3クラスを使うためにメインクラス作成します
今回は抽象化してるのでanimalオブジェクトをnewすることはできない
抽象クラスそのものはnewできないので具象クラスとして継承する必要がある

・animalクラスをnewした、アニマルObj

・animalクラスを継承した、人間クラスをnewした、人間Obj
・animalクラスを継承した、猫クラスをnewした、猫Obj の存在を作成する

//Mainクラスはanimal,cat,humanの3つのクラスがありそのうちanimalが抽象元/継承元であり具象先/継承先としてcat,humanクラスを作成してます
public class Mainexe {
    public static void main(String[] args) {
//今回は抽象化してるのでanimalオブジェクトをnewすることはできない。抽象クラスの継承先の(具象クラス)でしかnewできない。
        //Animal animal = new Animal();
//catとhumanクラスをnewしてanimalクラスを継承してインスタンス化されmainに存在させる
        Cat cat = new Cat();  
        Human human = new Human();
        
//catクラスのcryメソッドを実行、これは抽象メソッドなので、継承先で必ずオーバーライドする必要がある
        cat.cry();
//抽象メソッドなので、継承先で必ずオーバーライドする必要がある
        human.cry();
        //animal.cry();
//animalクラスの具象メソッドであるjumpメソッドをオーバーライド
        cat.jump();
//humanにはjumpが定義されてないので継承元の具象メソッドで実行されます
        human.jump();
        //animal.jump();
//imaginationはhumanにしかないメソッドなのでそのまま実行される
        human.imagination();
    }
}