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

Javaの抽象クラスとポリモーフィズムを完全解説!初心者でもわかるオブジェクト指向の基本

335
Java の抽象クラスとポリモーフィズム(多態性)

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

生徒

「Javaの抽象クラスってなんですか?インターフェースとどう違うんですか?」

先生

「いい質問ですね。抽象クラスは、共通の処理や定義をまとめるための土台になるクラスなんです。」

生徒

「じゃあ、ポリモーフィズムってどう関係あるんですか?」

先生

「それも重要なポイントです。抽象クラスを使うことで、ポリモーフィズムを実現しやすくなるんですよ。詳しく解説していきますね。」

1. Javaの抽象クラスとは?基本を理解しよう

1. Javaの抽象クラスとは?基本を理解しよう
1. Javaの抽象クラスとは?基本を理解しよう

Javaの抽象クラス(abstract class)とは、共通する処理やプロパティを定義するための設計図のようなクラスです。抽象クラスは直接インスタンス化できず、必ず継承して使います。

例えば、動物という抽象的な概念を表す「Animal」クラスを作成し、そこから「Dog」や「Cat」などの具象クラスに継承させることで、共通の処理を統一できます。

抽象クラスでは、抽象メソッド(abstract method)を定義することができ、これによりサブクラスでの具体的な実装を強制することが可能になります。

2. 抽象クラスの基本構文と使用例

2. 抽象クラスの基本構文と使用例
2. 抽象クラスの基本構文と使用例

Javaで抽象クラスを定義するには、abstractキーワードを使います。以下に基本的な使用例を紹介します。


abstract class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    abstract void makeSound();

    void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println(name + " says: ワンワン!");
    }
}

このように、抽象クラスAnimalmakeSoundという抽象メソッドを持ち、それをDogクラスで実装しています。

3. 実行結果を見てみよう

3. 実行結果を見てみよう
3. 実行結果を見てみよう

では、実際に上記のDogクラスを使って動作を確認してみましょう。


public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog("ポチ");
        myDog.makeSound();
        myDog.eat();
    }
}

ポチ says: ワンワン!
ポチ is eating.

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

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

※ Amazon広告リンク

4. ポリモーフィズム(多態性)との関係

4. ポリモーフィズム(多態性)との関係
4. ポリモーフィズム(多態性)との関係

Javaの抽象クラスを使う最大のメリットの1つが、ポリモーフィズム(Polymorphism)の実現です。

ポリモーフィズムとは、「同じ型(親クラス)を使って、異なる振る舞い(サブクラスの実装)を実行できる」というオブジェクト指向の基本概念です。

たとえば、Animal型の変数にDogCatなどのインスタンスを代入して、共通のメソッドmakeSound()を呼び出すことで、それぞれのクラスに応じた動作を実行できます。

5. 具体的なポリモーフィズムの例

5. 具体的なポリモーフィズムの例
5. 具体的なポリモーフィズムの例

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println(name + " says: ニャーニャー!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal[] animals = {
            new Dog("ポチ"),
            new Cat("ミケ")
        };

        for (Animal a : animals) {
            a.makeSound();
            a.eat();
        }
    }
}

ポチ says: ワンワン!
ポチ is eating.
ミケ says: ニャーニャー!
ミケ is eating.

このように、配列Animal[]でポリモーフィズムを活用することで、コードを簡潔かつ拡張性の高い形に保てます。

6. 抽象クラスとインターフェースの違い

6. 抽象クラスとインターフェースの違い
6. 抽象クラスとインターフェースの違い

Javaでは、抽象クラスとインターフェースの両方が継承の仕組みを持っていますが、役割が異なります。

  • 抽象クラス:共通のロジック(フィールドや具象メソッド)を持たせたいときに使う
  • インターフェース:契約(メソッド定義)だけを提示して、複数の型に実装させたいときに使う

たとえば、Animalという抽象クラスにはnameフィールドやeatのような実装付きの共通処理を記述できますが、インターフェースにはフィールドを持つことはできません(定数以外)。

7. 抽象クラスが役立つシーンとは?

7. 抽象クラスが役立つシーンとは?
7. 抽象クラスが役立つシーンとは?

抽象クラスは、以下のようなケースで特に効果的です。

  • サブクラスで共通の初期化処理をまとめたいとき
  • 共通のロジックを継承させつつ、クラスごとに違う振る舞いをもたせたいとき
  • 複数のクラスに一貫したインターフェースを提供したいとき

ポリモーフィズムを意識した設計において、抽象クラスは非常に重要な役割を果たします。

8. 抽象クラスとポリモーフィズムの理解がJava上達のカギ

8. 抽象クラスとポリモーフィズムの理解がJava上達のカギ
8. 抽象クラスとポリモーフィズムの理解がJava上達のカギ

Javaにおける抽象クラスの役割やポリモーフィズムの使い方を理解することは、オブジェクト指向プログラミングを正しく設計・実装するうえで欠かせません。

初心者のうちは、インターフェースとの違いに戸惑うかもしれませんが、実際にコードを書いて動かしてみることで、理解が深まっていくはずです。

継承・抽象クラス・ポリモーフィズムというJavaの基本をしっかりと身につけて、柔軟で拡張性の高いコードが書けるようになりましょう!

まとめ

まとめ
まとめ

抽象クラスとポリモーフィズムの本質を理解する

今回はJavaにおける抽象クラスとポリモーフィズムについて、基礎から実践まで幅広く学びました。抽象クラスは共通の処理や設計をまとめるための重要な仕組みであり、オブジェクト指向プログラミングの土台となる考え方です。単なるクラスの継承とは異なり、抽象クラスを使うことで、子クラスに実装を強制しつつ、共通処理を効率よく再利用できます。Java初心者にとっては少し難しく感じるかもしれませんが、理解できるとプログラム設計の幅が大きく広がります。

Javaの抽象クラスは設計の土台になる

抽象クラスは、複数のクラスで共通する機能や状態をまとめるために使用されます。例えば動物という概念を抽象クラスで定義し、それをもとに犬や猫といった具体的なクラスを作成することで、共通処理を統一できます。Javaの抽象クラスではフィールドやコンストラクタ、通常のメソッドも持つことができるため、単なる宣言だけでなく実際の処理も共有できる点が特徴です。この仕組みによって、コードの重複を減らし、保守性の高いプログラムを実現できます。

ポリモーフィズムによる柔軟な設計

ポリモーフィズムとは、同じ型でありながら異なる振る舞いを実現する仕組みです。抽象クラスを利用することで、このポリモーフィズムを簡単に実現できます。親クラス型の変数に対して子クラスのインスタンスを代入し、同じメソッドを呼び出すだけで、それぞれのクラスに応じた処理が実行されます。この仕組みはJavaのオブジェクト指向において非常に重要であり、大規模なシステム開発でも頻繁に使用されます。

サンプルコードで理解を深める


abstract class Vehicle {
    abstract void move();

    void start() {
        System.out.println("エンジンを始動します");
    }
}

class Car extends Vehicle {
    @Override
    void move() {
        System.out.println("車が走ります");
    }
}

class Bicycle extends Vehicle {
    @Override
    void move() {
        System.out.println("自転車が進みます");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle v1 = new Car();
        Vehicle v2 = new Bicycle();

        v1.start();
        v1.move();

        v2.start();
        v2.move();
    }
}

エンジンを始動します
車が走ります
エンジンを始動します
自転車が進みます

このように、同じVehicle型を使っていても、実際には異なる動作が実行されます。これがポリモーフィズムの代表的な使い方です。

インターフェースとの違いも重要

抽象クラスとインターフェースは似ているようで役割が異なります。抽象クラスは共通の処理を持たせたい場合に適しており、インターフェースは機能の契約だけを定義したい場合に使用されます。Javaの設計では、この違いを理解して使い分けることが重要です。特に実務では、どちらを使うかによって設計の柔軟性や拡張性が大きく変わります。

実務で活かすためのポイント

抽象クラスとポリモーフィズムは、単なる文法ではなく設計の考え方です。共通処理は親クラスにまとめ、異なる処理は子クラスに任せるという構造を意識することで、読みやすく保守しやすいコードを書くことができます。また、新しい機能を追加する際にも既存のコードを大きく変更することなく対応できるため、拡張性の高いシステムを構築できます。Javaの学習を進めるうえで、この考え方をしっかり身につけることが重要です。

Javaオブジェクト指向の理解を深めよう

Javaの抽象クラスとポリモーフィズムを理解することで、オブジェクト指向の本質に一歩近づくことができます。クラス設計を行う際には、共通点と相違点を整理し、適切に抽象化することが求められます。最初は難しく感じるかもしれませんが、小さなプログラムから実際に手を動かしていくことで、徐々に理解が深まります。Java初心者の段階でこの基礎を身につけておくことは、将来の開発スキルに大きく影響します。

先生と生徒の振り返り会話

生徒

抽象クラスは共通の処理をまとめるための仕組みだと理解できました。

先生

その通りです。共通化と再利用が大きな目的です。

生徒

ポリモーフィズムは同じ型で違う動作をする仕組みでしたね。

先生

はい。これによって柔軟な設計が可能になります。

生徒

抽象クラスとインターフェースの違いも少し分かってきました。

先生

実務では使い分けが重要なので、意識していきましょう。

生徒

これからは設計を意識してコードを書いてみます。

先生

とても良い姿勢です。繰り返し練習することで理解が深まります。

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

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

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

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

Javaの抽象クラスとは、オブジェクト指向プログラミングにおいて「共通の性質や振る舞い」をまとめるための「設計図の設計図」のような役割を果たします。プログラミング初心者が混同しやすいポイントですが、抽象クラス自体は実体を持たない不完全なクラスであるため、ニュー(new)演算子を使って直接インスタンス化することができません。例えば、「動物」という概念は抽象的ですが、「犬」や「猫」は具体的です。Javaの設計において、全ての動物に共通する「名前(name)」や「食べる(eat)」という処理を抽象クラスに記述し、個別の具体的な動作は継承先のサブクラスに任せることで、コードの再利用性とメンテナンス性を大幅に向上させることができます。

なぜ抽象クラスは直接インスタンス化してオブジェクトを作ることができないのでしょうか?

抽象クラスがインスタンス化できない理由は、そのクラスの中に「具体的な処理が決まっていないメソッド(抽象メソッド)」が含まれている可能性があるからです。Javaのルールとして、中身が空っぽのメソッドを持つクラスからインスタンスを作ってしまうと、そのメソッドを呼び出した際にコンピュータが何をすべきか判断できず、プログラムが正常に動作しなくなります。そのため、Javaでは「abstract」キーワードが付いた抽象クラスのインスタンス化を禁止しており、必ず他のクラスで継承(extends)を行い、未完成の部分を具体的に実装(オーバーライド)してから利用する仕組みになっています。これにより、開発者が不完全なオブジェクトを作ってしまうミスを未然に防いでいます。
Javaの抽象クラスの一覧へ
新着記事
Flutter
FlutterのInheritedWidgetとは?仕組みと活用方法
FlutterのInheritedWidgetとは?仕組みと活用方法を初心者向けにやさしく解説
Flutter
Blocパターンの仕組みと導入方法をわかりやすく解説
FlutterのBlocパターンを完全ガイド!初心者でもわかる状態管理と導入方法
Python
NumPyのdstackの使い方!3次元配列を結合する方法
NumPyのdstackの使い方!3次元配列を結合する方法
Python
Seaborn catplotの基本的な使い方と主要引数(kind・hue・col・row)を徹底解説
Seaborn catplotの基本的な使い方と主要引数(kind・hue・col・row)を徹底解説
人気記事
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広告リンク