BLOG

【プログラマー 研修 Java】キャイダの記録4

2週間目に突入しました、キャイダです。
課題としましてはjavaは一通り終わり、総テストも行いました。
3時間30分かかると聞いて、美術大学の入試思い出しました。どっこいどっこいの時間です。

というところで復習したいと思います。

復習

本日は継承、抽象クラスついて復習していきたいと思います。

・継承

けいしょうです。
クラスを引き継いで登場する奴です。
例えばですが、山田、田中、という2人のキャラクターを登場させたかったとします。
その場合、一つのクラスで身長や名前をそれぞれ設定できるので、普通にインスタンス化しても実現可能です。

class Human{
  String name;
  int height;
     Human(String name , int height){
     this.name = name;
     this.height = height;
     }
    public void run(){
     System.out.println("走る");
     }
}

このようなクラスがあった場合、

Humam yamada = new Human(yamada , 170);
Humam tanaka = new Human(tanaka , 170);

上のように書けばそれぞれ山田と田中のインスタンスが出来上がります。
しかし、このままでは山田も田中も名前と身長が違うだけで、同じメソッドばかり呼び出してしまいます。
例えば山田君は走るときに「素晴らしいフォームで走る」ことにしましょう。
一方で田中君は運動が苦手なので「ふらふらと気だるげに走る」こととします。
クラス内にyamadaRunとtanakaRunの二つのメソッドを作ればいいではないのか?と思うでしょうが、それは美しくありません。
この時、一つのクラスで作ってしまうと田中君でも山田君の走りが出来てしまうのです。
このようにフィールドは同じだけども、メソッドの内容は別々に変えたい!
というときに継承の出番がやってくるのです。継承と言うだけあって何かを引き継ぎます。
ここでは田中君にHumanを継承させてみましょう。

class Tanaka extends Human {
   public void run(){
     System.out.println("ふらふらと気だるげに走る");
   }
}

上のようになります。Humanを継承したTanaka君クラスです。
上のメソッドしか書いてませんが、彼はnameフィールドとheightフィールドを持っています。
Humanから引き継いでますからね。
また、同じくrunメソッドを書いてますが、これはHumanクラスのrunを上書きしたTanaka独自のrunメソッドです。
このように継承元のメソッドを上書きすることをオーバーライドといいます。
また、継承元のことをスーパークラスといいます。
これがざっくり継承の概要です。

お次は抽象クラスについて書き記します。

抽象クラス

クラスに関することがたくさん出てきますね。クラスのバーゲンセールです。
抽象という言葉の意味は分かりますか?
キャイダはよくわからなかったので調べました。

「他との共通点に着目し、一般的な観念にまとめること」

というのが抽象という意味らしいです。

要は具体的なクラスではないということですね。
この抽象クラスはなんのためにあるかというと、この抽象クラスだけではインスタンス化できないことにあります。
インスタンス化のできないクラスに存在価値はあるのか?と思うでしょうが、すごい存在価値があるのです。
メリットを見ていきましょう。

1.インスタンス化できない→間違いのあるインスタンスを生み出さない。

2.継承するときに、何を実装しなくてはいけないかわかりやすい。

この2つが主なメリットになります。
プログラムを作るときは、基本的にチームでの制作になります。
その時、継承する前提のクラスがあった場合、誰かが間違えて継承前にクラスをインスタンス化してしまったら
こちらの意図とは違うので修正が大変です。
また、継承した後も実装してほしいメソッドを指定できるので、いわゆるメソッドの入力し忘れを防ぐことが可能になります。

以上が抽象クラスのメリットです。
実際に書き方を見てみましょう。

abstract class Human{
  String name;
  int age;

  abstract void run();

}

このようにインスタンス化しないでくれよな~っていう抽象クラスは
先頭にabstractをつけます。中の実装してほしいメソッドにも同様につけるようになっています。
メソッドはしっかりとオーバーライドしないとエラーがでるので、そこはご注意を。
この抽象Humanクラスは継承することで初めてインスタンス化可能です。

それでは、本日はこのへんにして、次回はインタフェース、多態性について書いていきたいと思います。

BLOGトップへ戻る