カテゴリ: Javaの抽象クラス 更新日: 2026/08/16

Javaの抽象クラスと通常メソッドの使い分け方!初心者でもわかる基礎から実践

330
Java の抽象クラスと通常のメソッドを組み合わせる使い方

先生と生徒の会話形式で理解しよう

生徒

「Javaの抽象クラスって、どんなときに使うんですか?」

先生

「抽象クラスは、共通の機能は持たせつつも、一部の機能は子クラスで実装させたいときに使います。インターフェースとは違って、通常のメソッドも持てるんですよ。」

生徒

「通常のメソッドも一緒に書けるってことですか?どんな風に使えばいいんですか?」

先生

「じゃあ、Javaの抽象クラスに通常のメソッドを組み合わせた使い方について、順を追って解説していきましょう。」

1. Javaの抽象クラスとは?

1. Javaの抽象クラスとは?
1. Javaの抽象クラスとは?

Javaの抽象クラス(abstract class)は、クラスの設計段階で共通する処理や構造をまとめて定義し、継承するサブクラスで具体的な実装を補完するために使います。抽象クラスは、完全に抽象的である必要はなく、通常の具体的なメソッド(処理の中身があるメソッド)も一緒に定義することができます。

この「抽象メソッド」と「通常のメソッド」を併用することで、コードの再利用性を高めつつ、柔軟な設計が可能になります。

2. 抽象メソッドと通常メソッドの違い

2. 抽象メソッドと通常メソッドの違い
2. 抽象メソッドと通常メソッドの違い

抽象クラスには、以下の2種類のメソッドを定義できます。

  • 抽象メソッド:処理内容を持たず、サブクラスでオーバーライドして具体的な処理を書く必要があるメソッド。
  • 通常メソッド:処理内容を持っていて、そのままサブクラスで使えるメソッド。

抽象クラスを使う最大のメリットは、共通処理は抽象クラス内で一括管理し、個別の処理だけをサブクラスに任せるという設計ができることです。

3. 実際のコードで理解しよう

3. 実際のコードで理解しよう
3. 実際のコードで理解しよう

それでは、Javaの抽象クラスに通常メソッドと抽象メソッドを組み合わせた例を見てみましょう。


abstract class Animal {
    // 抽象メソッド(サブクラスで実装が必要)
    public abstract void makeSound();

    // 通常のメソッド(そのまま使用可能)
    public void sleep() {
        System.out.println("スヤスヤ眠っています...");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("ワンワン!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("ニャーニャー!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound(); // ワンワン!
        dog.sleep();     // スヤスヤ眠っています...

        Animal cat = new Cat();
        cat.makeSound(); // ニャーニャー!
        cat.sleep();     // スヤスヤ眠っています...
    }
}

この例では、makeSound()は抽象メソッドとして定義されていて、各動物クラスで具体的に実装されています。一方sleep()は共通の処理なので、抽象クラスで定義して使い回しています。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第5版をAmazonで見る

※ Amazon広告リンク

4. 通常メソッドを活用するメリットとは?

4. 通常メソッドを活用するメリットとは?
4. 通常メソッドを活用するメリットとは?

抽象クラスで通常のメソッドを使うことで、次のようなメリットがあります。

  • コードの重複を避けられる:共通の処理を一箇所にまとめることで、各クラスに同じコードを書く必要がなくなります。
  • 保守性が高くなる:共通処理を変更するとき、抽象クラスのメソッドだけ修正すればすべての子クラスに反映されます。
  • テンプレートパターンにも応用可能:基本の流れを抽象クラスで定義し、一部だけサブクラスで差し替える設計が可能です。

5. 通常メソッドと抽象メソッドの使い分け方

5. 通常メソッドと抽象メソッドの使い分け方
5. 通常メソッドと抽象メソッドの使い分け方

「すべての子クラスで同じ処理をさせたい」なら通常メソッド、「子クラスごとに違う処理をさせたい」なら抽象メソッドを使うのが基本です。

たとえば次のように使い分けます:

  • logMessage()のようなロギング処理 → 通常メソッド
  • draw()のような描画処理(図形によって異なる) → 抽象メソッド

6. よくあるエラーと注意点

6. よくあるエラーと注意点
6. よくあるエラーと注意点

抽象クラスや抽象メソッドを使う際には、以下のポイントに注意しましょう。

  • 抽象クラスはインスタンス化できない:直接newすることはできません。
  • 抽象メソッドは中身を書いてはいけない:中括弧({})を使って処理を書こうとするとエラーになります。
  • 抽象メソッドを1つでも持つクラスは抽象クラスにする必要がある:コンパイルエラーになるので注意。

7. インターフェースとの違いも押さえておこう

7. インターフェースとの違いも押さえておこう
7. インターフェースとの違いも押さえておこう

Javaでは、似たような仕組みとして「インターフェース」もありますが、抽象クラスとは以下の点が異なります。

  • インターフェース:すべてのメソッドが抽象的(ただしJava 8以降はdefaultメソッドも定義可能)
  • 抽象クラス:抽象メソッドと通常メソッドを混在させることができる

どちらを使うか迷ったら、「共通処理をまとめたいなら抽象クラス」、「実装だけ任せたいならインターフェース」と覚えるとよいでしょう。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaの抽象クラス(abstract class)とは具体的にどのような役割を持つクラスなのですか?

Javaの抽象クラスとは、プログラミングの設計図の段階で「共通する性質や機能」をあらかじめまとめて定義しておくための特殊なクラスです。通常のクラスとは異なり、それ自体をインスタンス化(newしてオブジェクトを作ること)はできません。主な役割は、継承関係にある子クラス(サブクラス)に対して「必ず実装しなければならないメソッド」を指示することと、すべての子クラスで共通して利用できる「通常のメソッド」を提供することにあります。これにより、開発者はコードの重複を避け、統一感のあるプログラムを効率的に設計できるようになります。

抽象クラスの中で定義される「抽象メソッド」と「通常のメソッド」の決定的な違いは何ですか?

抽象メソッドと通常メソッドの最大の違いは「処理の中身(メソッド体)」を持っているかどうかです。抽象メソッド(abstract修飾子がついたメソッド)は、メソッドの名前や戻り値の型、引数などの定義だけを行い、具体的な処理内容は記述しません。そのため、継承した子クラス側で必ずオーバーライド(再定義)して具体的な中身を書く必要があります。一方、通常メソッド(具体的なメソッド)は、抽象クラスの中に最初から具体的な処理内容を記述したメソッドです。子クラスはこれをそのまま利用することも、必要に応じて上書きすることもできるため、共通処理の使い回しに適しています。
Javaの抽象クラスの一覧へ
新着記事
Flutter
Flutter Web開発の始め方!環境構築と基本の流れ
Flutter Web開発の始め方を完全ガイド!初心者でもわかる環境構築と基本の流れ
Flutter
FlutterのInheritedWidgetとは?仕組みと活用方法
FlutterのInheritedWidgetとは?仕組みと活用方法を初心者向けにやさしく解説
Flutter
Blocパターンの仕組みと導入方法をわかりやすく解説
FlutterのBlocパターンを完全ガイド!初心者でもわかる状態管理と導入方法
Python
NumPyのdstackの使い方!3次元配列を結合する方法
NumPyのdstackの使い方!3次元配列を結合する方法
人気記事
Flutter
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク