カテゴリ: JavaSilver試験対策 更新日: 2026/03/26

Javaの抽象クラス徹底解説!基本から応用まで初心者向けガイド

047
Javaの抽象クラス

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

生徒

「抽象クラスって何ですか?インタフェースとの違いも教えてください!」

先生

「抽象クラスは、クラスとインタフェースの性質を合わせ持ったものです。共通する実装を持たせつつ、具体的な処理はサブクラスに任せることができます。一緒に学んでいきましょう!」

1. 抽象クラスとは?

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

抽象クラスは、Javaでオブジェクト指向プログラミングを行う際に重要な役割を果たすクラスです。abstractキーワードを使って定義され、以下の特徴を持ちます:

  • 抽象クラスはインスタンス化できません。
  • 具象メソッド(具体的な実装を持つメソッド)と抽象メソッド(実装を持たないメソッド)の両方を定義できます。
  • 抽象クラスは、サブクラスに共通の動作を提供するために使用されます。

次の例を見てみましょう:


public abstract class Animal {
    public abstract void makeSound(); // 抽象メソッド

    public void sleep() { // 具象メソッド
        System.out.println("Sleeping...");
    }
}

このコードでは、Animalクラスに抽象メソッドmakeSoundと具象メソッドsleepが定義されています。

2. 抽象クラスの継承と実装

2. 抽象クラスの継承と実装
2. 抽象クラスの継承と実装

抽象クラスを継承するクラスは、その抽象メソッドを実装する必要があります。以下に例を示します:


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

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 出力: Woof Woof!
        dog.sleep();     // 出力: Sleeping...
    }
}

このコードでは、DogクラスがAnimalクラスを継承し、makeSoundメソッドを実装しています。

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

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

抽象クラスとインタフェースは似ていますが、以下の違いがあります:

  • 抽象クラスは具象メソッドとフィールドを持つことができますが、インタフェースは基本的に定数フィールドと抽象メソッドのみを持ちます(Java 8以降、一部例外あり)。
  • クラスは1つの抽象クラスしか継承できませんが、複数のインタフェースを実現できます。
  • 抽象クラスは共通の動作を提供し、インタフェースは「型」としての役割を強調します。

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

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

※ Amazon広告リンク

4. 試験対策ポイント

4. 試験対策ポイント
4. 試験対策ポイント
  • 抽象クラスはインスタンス化できません。
  • 抽象メソッドは、具象クラスが必ず実装しなければなりません。
  • 抽象クラスを継承した抽象クラスも作成できます。
  • 公開フィールドにはサブクラスから自由にアクセスできます。

5. 抽象クラスにコンストラクタは作れる?

5. 抽象クラスにコンストラクタは作れる?
5. 抽象クラスにコンストラクタは作れる?

抽象クラスはインスタンス化できませんが、コンストラクタを定義することは可能です。 抽象クラスのコンストラクタは、サブクラスのオブジェクトが生成されるときに呼び出されます。

次のコードを見てみましょう:


public abstract class Animal {

    public Animal() {
        System.out.println("Animal constructor");
    }

    public abstract void makeSound();
}

public class Dog extends Animal {

    public Dog() {
        System.out.println("Dog constructor");
    }

    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

この場合、Dogのオブジェクトが生成されると、まずAnimalのコンストラクタが呼び出され、その後にDogのコンストラクタが実行されます。

6. 抽象クラスをさらに抽象クラスで継承する

6. 抽象クラスをさらに抽象クラスで継承する
6. 抽象クラスをさらに抽象クラスで継承する

抽象クラスは、別の抽象クラスに継承させることもできます。 この場合、抽象メソッドを実装しなくても問題ありません。最終的な具象クラスが実装すればよいからです。

次の例を見てみましょう:


public abstract class Animal {
    public abstract void makeSound();
}

public abstract class Mammal extends Animal {
    public void breathe() {
        System.out.println("Breathing...");
    }
}

public class Dog extends Mammal {

    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

このように、抽象クラス同士で継承関係を作ることで、 共通の機能を段階的に整理することができます。

7. 抽象クラスを使う設計パターン

7. 抽象クラスを使う設計パターン
7. 抽象クラスを使う設計パターン

抽象クラスは、複数のクラスで共通する処理をまとめるときによく使われます。 特に「テンプレートメソッドパターン」と呼ばれる設計でよく利用されます。

次の例を見てみましょう:


public abstract class Game {

    public void play() {
        start();
        perform();
        end();
    }

    abstract void start();
    abstract void perform();
    abstract void end();
}

public class Soccer extends Game {

    void start() {
        System.out.println("Soccer game started");
    }

    void perform() {
        System.out.println("Playing soccer...");
    }

    void end() {
        System.out.println("Soccer game finished");
    }
}

この例では、ゲームの流れ(playメソッド)は抽象クラスで定義し、 実際の処理はサブクラスで実装しています。 このように抽象クラスを使うことで、プログラムの構造を整理しやすくなります。

まとめ

まとめ
まとめ

今回は、Javaの抽象クラスについて基本から応用まで解説しました。抽象クラスは、インスタンス化できないため継承専用ですが、共通の機能をサブクラスに提供する重要な役割を持っています。また、抽象メソッドを使用することで、サブクラスに具体的な実装を強制できます。 抽象クラスとインタフェースの違いについても学びましたが、それぞれの特徴を理解して使い分けることが重要です。

以下は、抽象クラスを活用した簡単なサンプルコードです:


public abstract class Vehicle {
    public abstract void start();

    public void stop() {
        System.out.println("The vehicle stops.");
    }
}

public class Car extends Vehicle {
    @Override
    public void start() {
        System.out.println("The car starts with a key.");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle myCar = new Car();
        myCar.start(); // 出力: The car starts with a key.
        myCar.stop();  // 出力: The vehicle stops.
    }
}

このコードでは、Vehicleクラスを抽象クラスとして定義し、サブクラスCarが抽象メソッドstartを実装しています。

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

生徒

「抽象クラスって、具体的な実装と抽象的なメソッドを混ぜられるのが便利ですね!」

先生

「その通りです。継承関係を設計するときに、抽象クラスを使うと共通の動作を簡単にまとめられますよ。」

生徒

「インタフェースとの違いもわかりました。複数のインタフェースを実現する場合と、抽象クラスを1つだけ継承する場合の使い分けが重要なんですね。」

先生

「その通り!抽象クラスとインタフェースを適切に使い分けて、効率的なコードを書いていきましょう。」

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

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

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

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

Javaの抽象クラスとは、オブジェクト指向プログラミングにおいて「共通の性質や動作」をまとめるための特殊なクラスです。abstractキーワードを用いて定義され、それ自体をインスタンス化(newしてオブジェクトを作ること)することはできません。抽象クラスの最大の役割は、継承関係にあるサブクラスに対して、共通のメソッド(具象メソッド)を提供しつつ、必ず実装すべきルール(抽象メソッド)を定義することにあります。これにより、プログラムの設計図としての役割を果たし、コードの再利用性と保守性を高めることができます。
JavaSilver試験対策の一覧へ
新着記事
Java
Java の UUID クラスを使って一意の識別子を作成する方法
JavaのUUIDクラスの使い方を完全ガイド!初心者でもわかる一意な識別子の作成方法
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
Java
Java のカレンダー機能(java.util.Calendar)の使い方
JavaのCalendarクラスの使い方をわかりやすく解説!日付や時刻の操作に便利な基本機能まとめ
Flutter
Dartのパッケージ管理(pubspec.yaml)の使い方
FlutterとDartのパッケージ管理完全ガイド!pubspec.yamlの使い方を初心者向けに徹底解説
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク