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。一方で、クラスであるため多重継承は許可されません。一般的には、まずインターフェースを優先して利用し、共通機能に関心がある場合に抽象クラスを利用する、という使い分けになります。
Note
**インターフェースのabstract修飾子**
`interface`命令と下位メソッドにも`abstract`修飾子を付けることができます。しかし、インターフェースではすべてが抽象メソッドであることが決まっているため、`abstract`修飾子も省略するのが一般的です。
-
Java SE 8からは、インターフェースでもデフォルト実装を持つことが可能になりました。 ↩︎