Javaの抽象メソッドとは?使い道と中身を書かない理由をわかりやすく解説

最終更新日

Schoo Java入門 初級 第7回 継承とインターフェース

本記事は、Schooの「Java入門 初級【2026年版】」第7回「継承とインターフェース」を学ぶ前後に、Javaの抽象メソッドを整理したい方向けのステップアップ学習記事です。

結論からいうと、抽象メソッドは「メソッド名、引数、戻り値だけを決めて、処理の中身は子クラスや実装クラスに任せる」ための仕組みです。

抽象クラスでもインターフェースでも、抽象メソッドの考え方は重要です。最近のJavaプログラミングでは、インターフェースで呼び出し方をそろえ、実装クラスごとに処理を変える場面がよくあります。

Schoo コースページ:Java入門 初級【2026年版】

抽象メソッドは中身を書かないメソッド

普通のメソッドは、メソッド名だけでなく、処理の中身も書きます。

public void send(String message) {
    System.out.println("通知:" + message);
}

一方、抽象メソッドでは処理の中身を書きません。メソッド名、引数、戻り値だけを決めます。

void send(String message);

この書き方は「何もしない」という意味ではありません。「send という名前で、String のメッセージを受け取る処理を、あとで必ず作る」という意味です。

図解:抽象メソッドは「形だけ決めて、中身は任せる」
決める側
void send(String message);
メソッド名、引数、戻り値だけを決める
作る側
public void send(…) { … }
実際に何をするかはクラスごとに書く
抽象メソッドは「何もしないメソッド」ではなく、あとで中身を書いてもらうための決まりです。

抽象クラスで使う抽象メソッド

抽象クラスでは、abstract を付けて抽象メソッドを書けます。共通処理は親クラスに持たせつつ、クラスごとに違う処理だけを子クラスに任せられます。

public abstract class NotificationSender {
    public void printLog(String message) {
        System.out.println("通知ログ:" + message);
    }

    public abstract void send(String message);
}

printLog() は共通処理です。send() は通知方法によって中身が変わるため、抽象メソッドとして子クラスに任せています。

public class EmailSender extends NotificationSender {
    @Override
    public void send(String message) {
        System.out.println("メール送信:" + message);
    }
}

EmailSenderNotificationSender を継承しているため、send() の中身を必ず書く必要があります。

インターフェースで使う抽象メソッド

インターフェースのメソッドも、基本的には実装クラスに中身を書かせるためのメソッドです。初学者の段階では、インターフェースに書くメソッドも抽象メソッドの一種として考えると整理しやすくなります。

public interface MessageSender {
    void send(String message);
}

send() は中身を書いていません。MessageSender を実装するクラスが、実際の処理を書きます。

public class ChatSender implements MessageSender {
    @Override
    public void send(String message) {
        System.out.println("チャット送信:" + message);
    }
}

このように、インターフェースでは「send() という呼び方をそろえる」ことを決め、実際の処理はクラスごとに変えられます。

図解:抽象クラスでもインターフェースでも考え方は同じ
抽象クラス
abstract void send(…);
共通処理を持ちながら、子クラスで作る処理も決められる
インターフェース
void send(…);
共通の呼び方を決め、実装クラスに中身を書かせる
どちらも「呼び出し方を先に決め、中身は具体的なクラスに書く」という点が重要です。

抽象メソッドがあると何がうれしいのか

抽象メソッドがあると、呼び出す側は「どのクラスか」を細かく知らなくても、同じメソッド名で処理を呼び出せます。

public void notifyUser(MessageSender sender, String message) {
    sender.send(message);
}

notifyUser() は、メール通知なのかチャット通知なのかを知る必要がありません。MessageSender として受け取り、send() を呼び出すだけです。

あとからアプリ通知やログ通知を追加しても、MessageSender を実装したクラスを作れば、同じ呼び出し方で扱いやすくなります。

図解:呼び出す側は同じsend()だけを見ればよい
呼び出す側
sender.send(message);
抽象メソッド
void send(…);
実装クラス
EmailSender や ChatSender の処理が動く
抽象メソッドがあることで、呼び出す側と実際の処理を分けて考えやすくなります。

抽象メソッドで初学者がつまずきやすい点

抽象メソッドは中身がないため、「これは実行できないのでは」と感じやすいです。確かに、抽象メソッドそのものに処理の中身はありません。

ただし、実際に動くのは抽象メソッドを実装したクラス側の処理です。呼び出す側は共通の形で呼び出し、実際の中身は EmailSenderChatSender などのクラスが担当します。

そのため、抽象メソッドを見るときは「ここには中身がない」だけで止まらず、「どのクラスがこの中身を書くのか」まで追いかけると理解しやすくなります。

確認問題

  1. 抽象メソッドは、メソッドのどの部分を決めて、どの部分を子クラスや実装クラスに任せますか。
  2. void send(String message); は、何もしないメソッドという意味ですか。それとも、あとで中身を書くための決まりですか。
  3. インターフェースで抽象メソッドを使うと、呼び出す側にはどのような利点がありますか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

抽象メソッドは、メソッド名、引数、戻り値だけを決め、処理の中身を子クラスや実装クラスに任せる仕組みです。抽象クラスでは共通処理と組み合わせて使えます。インターフェースでは、共通の呼び出し方を決め、実装クラスごとに処理を変えるために使えます。最初は「中身がないメソッド」ではなく、「中身を書くことを約束するメソッド」と考えると理解しやすくなります。

info

シェアする