目的
オブジェクト指向における特徴の1つである「拡張性」にて「継承」の概念があり、そこで取り扱う、かつ重要な機能であるスーパークラス(親クラス)、サブクラス(子クラス)を覚えることで、以下2つのスキルアップするための足掛かりとする。
・保守性の高いプログラムが書けるようになる
・プログラムの静的解析力向上
オブジェクト指向とは?
「オブジェクト指向」とは、コンピュータプログラムをオブジェクトという小さなプログラムの集まりと捉えて、プログラム全体を構築する手法です。
言葉では少し伝わりにくいと思いますので、図を用いて説明します。
例えば、車を作る工場を思い浮かべてください。その工場は支店が1つのみで外注はせず、自分たちで部品の制作から組み立てまで行う工場だとします。
その場合、1つの場所で組み立てまで行うためスムーズに車を作成することができます。
では、この工場が1つだけでなくA町に1店舗、隣町のB町にもう1店舗のような、複数ある場合はどうでしょうか。
この場合、A 町工場とB町工場ではそれぞれで同じ部品を作成し、同じ組み立て作業をして車を完成させることになり、全く同じ作業を2箇所で行っていることになります。これだと効率が悪いです。
では、以下のように作業を複数行うのではなく部品製造専門の工場を1つ置き、次の作業現場に引き継ぐ方法はどうでしょうか。
この方法ですと、部品を作成する工程は1箇所で済むため効率は良くなります。そして、もし新しい工場を増やす場合はその工場に部品を作成する環境を用意する必要がなくなることもメリットです。
プログラミングでも同様です。複数のオブジェクトを独立させることにより、そのオブジェクトを新たに作成しなくても既にあるオブジェクトを使い回すことによって、その度に同じコードを書く必要もなくなります。その結果、効率的で簡潔なコードを作成することができます。
スーパークラスとサブクラス
スーパークラスとは他のクラスの派生元クラスのことであり、その機能を受け継いでかつ、独自の機能を持たせたクラスのことをサブクラスといいます。スーパークラスはサブクラスに使用されることを想定し、抽象度を上げておいたり、各サブクラスにて共通に使用する機能を持たせます。同じ機能を1つにまとめることで、プログラムの修正やテストの手間が省ける可能性があります。
【自動車の例でスーパークラスとサブクラスを説明】
・スーパークラス→自動車
・サブクラス→消防車、除雪車
自動車の機能
・走る
・止まる
消防車の機能
・走る(スーパークラスの機能)
・止まる(スーパークラスの機能)
・放水する(サブクラスの機能)
・はしごをかける(サブクラスの機能)
除雪車の機能
・走る(スーパークラスの機能)
・止まる(スーパークラスの機能)
・除雪する(サブクラスの機能)
サンプルプログラム
【継承の書き方(構文)】
アクセス修飾子 class クラス名(サブクラス名) extends 継承元クラス(スーパークラス) {
サブクラスの処理
}
※final修飾子がついているクラスは継承できない。
※Javaでは多重継承禁止。
【サブクラスの機能】
・オーバーライド
スーパークラスのメソッドの内容をサブクラスで再定義(スーパークラスで定義したメソッドと目的は同じだが、処理を変えたい)することです。
サブクラスのインスタンスからオーバーライドしたメソッドが呼び出された時は、サブクラスで書き換えた(オーバーライド)メソッドが呼び出されます。
サブクラスにオーバーライドさせたくない場合は、メソッドにfinal修飾子を付与します。
・super.メソッド名
スーパークラスのメソッドを呼び出します。
・super.フィールド名
スーパークラスのフィールドを呼び出します。
<スーパークラス>
【自動車クラス】
スーパークラスです。共通機能として「あいさつ」「走る」「止まる」を定義しています。
carMethods()は当クラスにて定義しているメソッド一覧となります。
<サブクラス1>
【消防車クラス】
サブクラスです。独自機能として「放水する」「はしごをかける」を定義しています。
「あいさつ」を当クラス用に書き換えしています(オーバーライド)。
fireTruckMethods()は当クラスにて定義しているメソッド一覧とスーパークラスのメソッド(“super.”が付いているメソッド)となります。
<サブクラス2>
【除雪車クラス】
サブクラスです。独自機能として「除雪する」を定義しています。
「あいさつ」を当クラス用に書き換えしています(オーバーライド)。
snowplowMethods()は当クラスにて定義しているメソッド一覧とスーパークラスのメソッド(“super.”が付いているメソッド)となります。
<実行クラス>
【実行クラス】
自動車クラス、消防車クラス、除雪車クラス、それぞれに定義しているメソッドを実行します。(各クラスに定義している一覧メソッド “12、17、22行目” を実行します)
<実行結果>
【実行結果】
あいさつメソッドはそれぞれのサブクラスで変更(オーバーライド)しているので、同じあいさつメソッド(greeting)を実行しても出力結果が異なります。また、サブクラスからスーパークラスのメソッド「走る」「止まる」を呼び出せています。
参考書籍やサイト
「プロになるJava」
https://gihyo.jp/book/2022/978-4-297-12685-8
入門書に最適です。Javaの基本構文から、開発時に使用するツール(Maven、JUnit、Gitなど)や、フレームワーク(Spring Boot)を用いてWebアプリケーションの実装まで、実際の開発時に役立つ内容が満載です。今回、説明した継承についてもより詳しく分かりやすく記載されているのでお勧めです。
「Java言語で学ぶデザインパターン入門第3版」
https://www.hyuki.com/dp/
今回、説明した継承やオブジェクト指向について、もっと深く知りたいという方にお勧めです。ここに記載されているデザパタを理解できれば、オブジェクト思考プログラミングを理解できると思います。
「はてなブックマーク/テクノロジー」
https://b.hatena.ne.jp/hotentry/it
技術系に関連して注目されている記事やウェブサイトなどがまとめられています。ここから役立つ情報を探してみてください。
「企業技術系ブログ」
https://hatena.blog/dev
企業で働くエンジニアの技術ブログがまとめられています。自社にて採用している技術についての説明など、役に立つ情報が多々あります。
まとめ
今回紹介した簡単な内容(図など)からまずは理解し、イメージできるようにしてからプログラミングに落とし込むと理解が進むと思います。焦らず自分のペースで1つずつ理解していってください。
もっと理解を深めたい方は紹介した参考書などから知識を得てください。参考書以外にも勉強会(JJUGなど)に参加して、学びの機会を増やしていきましょう。
※JJUG(日本Javaユーザグループ)
https://www.java-users.jp/