【はじめてのJava】クラスの抽象化2【クラスの継承編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
クラスの継承編
クラスの継承編では、Javaを扱う上で重要な「クラスの継承」について扱っていきます。
前回は、クラスの抽象化を説明してきました。
今回も引き続きクラスの抽象化について考えてみます。なお、この内容はJava Silverよりも少し高度な内容です。
目次
クラスの設計
プログラムを作るときに、いきなりソースコードの作成を始めることはまずありません。通常はまずプログラムの全体像やクラスの設計図を考えます。
今回は抽象クラスの使い方を考えます。
抽象クラスの使いどころ
前回はPoliceCarクラスとAmbulanceクラスを基にクラスの抽象化を行い、親クラスとなるCarクラスを定義しました。
今回も同じようにクラスの抽象化を行いたいと思います。今回はCatとDogを基に同じように抽象化を行って親クラスとなる動物クラスを定義してみましょう。
共通の特徴を整理する
CatとDogにはそれぞれ「走る」「食べる」「鳴く」メソッドが定義されていたとします。
これらを共通の特徴としてまとめてみます。
共通の特徴を定義した「Animal」クラスを定義できました。一見するとこれで抽象化は終わりに見えます。
しかし、実はこのままだと1つ問題があります。
問題点
一見すると何も問題が無いように見えます。
そこで、作ったクラスをインスタンス化してみましょう。
このように、CatやDogは問題なくインスタンス化できます。
では、Animalはどうでしょうか。
実は、このままであれば、Animalもインスタンス化可能です。
しかし、よく考えてみましょう。
「Cat」や「Dog」は具体的な動物ですのでインスタンス化は想像できます。
が、「Animal」は概念的なものであり、直接インスタンス化してしまうと「正体不明な動物インスタンス」ができてしまいます。
では、どうすればいいのでしょうか。
抽象クラスとして定義する
このような場合は 抽象クラスとして定義 します。
こうすることで、「Cat」や「Dog」の特徴をまとめた「Animal」クラスを定義できる一方で、「Animal」そのものはインスタンス化できなくなります。
まとめ
クラスの抽象化をした際に、親クラスを直接インスタンス化すると違和感がある場合(直接インスタンス化させたくない場合)は抽象クラスとして定義する。
次回
次回もクラスの設計について考えてみます。
はじめてのJavaシリーズの目次はこちら
クラスの継承編はこちら