注目記事

【Javaコード入門】修飾子_③abstract修飾子

抽象メソッド/抽象クラスを定義する – abstract修飾子

抽象メソッドとは、本体がなく、シグニチャ(メソッド名や引数、戻り値)だけで構成されるメソッドで、abstract修飾子を付与して定義します。その性質上、そのままでは利用できませんので、サブクラスでオーバーライドしなければなりません。抽象メソッドとは、サブクラスで実装しなければならない機能を宣言するためのしくみ、と言い換えても良いでしょう。
抽象メソッドを含むクラスは抽象クラスと呼ばれ、同じくabstract修飾子を付与しなければなりません。
たとえば以下は、抽象クラスModAbstractを継承したModAbstractChildクラスの例です。

ModAbstract.java

  1. package com.example.mynavi.modifier;
  2.  
  3. public abstract class ModAbstract {
  4.   abstract void test();
  5. }

ModAbstractChild.java

  1. package com.example.mynavi.modifier;
  2.  
  3. public class ModAbstractChild extends ModAbstract {
  4.   void test() { /* ...具体的な処理...*/ }
  5. }

太字の箇所をコメントアウトすると、ModAbstractChildクラスはコンパイルエラーとなります。抽象クラスを継承する場合、サブクラスはすべての抽象メソッドをオーバーライドしなければなりません。
インターフェイスと同じく、サブクラスに対して特定の機能を実装することを促す(強制する)ためのしくみですが、実装を持てるという点が異なります(※)。反面、クラスなので、多重継承は許されていません。一般的には、インターフェイスを優先して利用し、共通的な機能(実装)に関心がある場合に抽象クラスを利用する、という使い分けになるでしょう。

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

 

インターフェイスでのabstract修飾子
interface命令と、配下のメソッドでも、abstract修飾子は付与できます。しかし、インターフェイスではすべてが抽象メソッドであることが自明なので、abstract修飾子も省略するのが一般的です

修飾子_目次
修飾子
アクセス修飾子
abstract修飾子
static修飾子
final修飾子
sealed/non-sealed修飾子
transient修飾子
volatile修飾子
synchronized修飾子
native修飾子
strictfp修飾子

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。