Chapter 15

Java 抽象クラス・抽象メソッド

おでん
おでん
2021.08.18に更新

抽象クラス・抽象メソッドとは

抽象メソッドとは、処理内容を記述しないメソッドです。
抽象クラスとは、抽象メソッドを持つクラスを指します。
抽象クラスはインスタンス化することができません
逆に、今まで使用してインスタンス化できていたクラスを具象クラスと言います。
インスタンス化することができないので、継承することで、抽象メソッドをオーバーライドしたサブクラスを定義して使用する必要があります。
なぜ、このように手間のかかる抽象クラスが必要なのでしょうか。
ここで、オーバーライドのおさらいをしておきましょう。

オーバーライドとは、スーパークラスで定義されているメソッドを、サブクラス内で再定義することです。
つまり、スーパークラスのメソッドをサブクラス用に、上書きで定義することです。
オーバーライドを定義するには、いくつかの規定があります。(代表的なものは以下)

- 戻り値の型、メソッド名、引数型、引数の数、引数の並びも同じにする必要がある
- スーパークラス以上の広い範囲のアクセス修飾子にする必要がある(大体public)

つまり、オーバーライドの規定に沿っていない場合、コンパイルエラーが出ます。
これによって、戻り値の型、メソッド名、引数型、引数の数、引数の並びが同じメソッドのみしか定義できないことになります。
このように複数のクラスが統一されていることで、安全に定義することができます。
そして、抽象メソッドで宣言された最低限のメソッドを保証するというメリットもあります。

abstract

参考:Javaの道

抽象クラス・抽象メソッドの記述

抽象クラスの記述は以下のように行います。

アクセス修飾子 abstract class クラス名 {}

抽象クラス内は、抽象メソッドと通常メソッドを混在することもできます。
また、インスタンス変数やstatic変数の宣言もできます。

抽象メソッドの記述は以下のように行います。

アクセス修飾子 abstract 戻り値の型 メソッド名(引数リスト);

注意点は、処理内容を記述しないため、「{}」は書かないという点です。
static修飾子、final修飾子、private修飾子は付与できません。
なぜなら、もしこれらの修飾子を付与できてしまうと、処理のない抽象メソッドを呼び出せてしまったり、抽象メソッドをオーバーライドできなくなってしまうからです。

以下、例です。

AbstractSuper.java
abstract class AbstractSuper {
  abstract void abMethod();   //抽象メソッド
  public void method(){};     //通常メソッド
}
AbstractSub.java
public class AbstractSub extends AbstractSuper {
  void abMethod(){};    //抽象メソッドをオーバーライド必須
}