Java abstract修飾子

抽象メソッド・抽象クラスの定義 - abstract修飾子

抽象メソッドは本体を持たず、シグネチャ(メソッド名、引数、戻り値)だけで構成されるメソッドで、abstract修飾子を付けて定義します。そのままでは利用できないため、サブクラスでオーバーライドしなければなりません。このような抽象メソッドは、サブクラスで実装すべき機能を宣言するための仕組みと言えます。

抽象メソッドを含むクラスを抽象クラスと呼び、必ずabstract修飾子を指定する必要があります。

たとえば、次は抽象クラスModAbstractを継承したModAbstractChildクラスの例です。

ModAbstract.java

package com.devkuma.basic.modifier;

public abstract class ModAbstract {
    abstract void test();
}

ModAbstractChild.java

package com.devkuma.basic.modifier;

public class ModAbstractChild extends ModAbstract {
    void test() { /* ...具体的な処理...*/ }
}

ModAbstractChildクラスでvoid test()メソッドをコメントアウトすると、クラスでコンパイルエラーが発生します。抽象クラスを継承する場合、サブクラスはすべての抽象メソッドをオーバーライドしなければなりません。

インターフェースと同じように、サブクラスに特定の機能の実装を強制するための仕組みですが、実装を持てるという点が異なります1。一方で、クラスであるため多重継承は許可されません。一般的には、まずインターフェースを優先して利用し、共通機能に関心がある場合に抽象クラスを利用する、という使い分けになります。


  1. Java SE 8からは、インターフェースでもデフォルト実装を持つことが可能になりました。 ↩︎