こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- javaの抽象クラス・抽象メソッドについて知りたい方
この記事を読むと
抽象クラス・抽象メソッドの使い方
が分かります。
javaの抽象クラス・抽象メソッドとは?
Java言語では処理内容を記述しないメソッドをもつクラスを定義することができます。
処理内容を記述しないメソッドを抽象メソッド、抽象メソッドをもつクラスを抽象クラスと呼びます。
抽象クラスや抽象メソッドはどのような時に使う?
抽象クラス
抽象クラスを利用するにはオブジェクト指向を理解している必要があります。
オブジェクト指向で重要な考え方として、「抽象と具体」があります。
佐藤さんという人をオブジェクト指向でプログラミングしてみます。
佐藤さんは抽象化すると人間です。
人間を抽象化すると生物などにもできますが、
ここでは抽象化するレベルは人間までとします。
- 人間→佐藤さん
という抽象→具体と表すことができますが、
佐藤さんの抽象概念である「人間」を抽象クラスとしてプログラミングをします。
すべての個人に共通する名前や年齢をメンバ変数として宣言した「人間クラス」から
佐藤さんや伊藤さん、鈴木さんなどのインスタンスを作成することができます。
抽象メソッド
抽象メソッドは人間クラスの段階では処理は不明だが、
個人クラスであれば記述できる処理を定義します。
例えば、
人間は食事をしますが、食べ方は人それぞれなので、
一旦食事という抽象メソッドを人間クラスに定義しておいて、
佐藤クラスや鈴木などの個人クラスの中で、
その人の食事メソッドの処理を具体的に記述します。
抽象クラスのメリット
インスタンス化させないようにできる
抽象クラスにすることで、継承するために作ったクラスを
誤ってインスタンス化しないようにすることができます。
抽象クラスはサブクラスが作られることを前提としているため、
インスタンス化ができません。
先程の例では、人間クラスは継承させたいだけで、
インスタンス化したいのは佐藤さんや鈴木さんです。
人間クラスを抽象メソッドにすることで、
インスタンス化しない、継承だけを行うクラスを作成することができます。
オーバーライドの忘れを防ぐことができる
また、抽象クラスで宣言された抽象メソッドは
必ずオーバーライドしなくてはなりません。
そのため、オーバーライドのし忘れを防ぐことができます。
抽象メソッドを使用せずに、オーバーライドをする前提で、
処理を記載していない通常のメソッドを作成したとします。
オーバーライドはデータ型や引数の並びなどが間違えていると
オーバーロードとして認識されてしまうことがあるため、
記述ミスする可能性が高いです。
確実にオーバーライドするために、
抽象メソッドとして宣言することで、コーディングミスを防ぐことが可能になります。
抽象クラスの構文
[修飾子] abstract class クラス名{ }
abstract(アブストラクト)キーワードを指定します。
具象メソッドと抽象メソッドを記述することができます。
※具象メソッドとは通常のメソッドのことです。
抽象クラスはインスタンス化できないため、サブクラスでnewします。
抽象メソッドがオーバーライドされていない場合はエラーになります。
抽象メソッドの構文
[修飾子] abstract 戻り値型 メソッド名(引数リスト);
抽象メソッドで注意したいのは引数リストのカッコのあとはセミコロンで終わることです。
通常のメソッドでは{処理}を記述しますが、抽象メソッドの場合は処理を記述しません。
サンプルプログラム
佐藤 太郎は沢山食べる。
佐藤 一郎は沢山食べる。
鈴木 裕二はおいしそうに食事する。