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(); } }