抽象クラスの目的と使い方

Javaにおける**抽象クラス(abstract class)**の目的と使い方について、以下に詳しく説明します。


抽象クラスの目的

抽象クラスは、共通の機能や基本構造を持つ複数のクラスの基本テンプレートとして機能します。主な目的は以下の通りです。

  1. コードの再利用性向上
    複数のサブクラスに共通するフィールドやメソッドを抽象クラスにまとめることで、コードの重複を減らし、再利用性を高めます。

  2. 設計の明確化
    抽象クラスを使うことで、すべてのサブクラスに共通して実装すべき機能と、サブクラスで具体的に実装すべき機能(抽象メソッド)を明確に区別できます。

  3. ポリモーフィズムの実現
    抽象クラス型の変数に対してサブクラスのインスタンスを代入することで、共通インターフェースとしてポリモーフィズムを実現できます。


抽象クラスの特徴

  • abstractキーワードを使用して定義します。

  • インスタンス化できません(直接オブジェクトを生成できない)。

  • 抽象メソッド(abstract method)を含むことができます。これは本体のないメソッドで、サブクラスが必ずオーバーライドして実装する必要があります。

  • 具象メソッド(通常のメソッド)やフィールドも含めることができます


抽象クラスの基本構文

java
abstract class Animal { String name; // コンストラクタ Animal(String name) { this.name = name; } // 共通の具象メソッド void sleep() { System.out.println(name + " is sleeping."); } // 抽象メソッド(サブクラスでの実装が必須) abstract void makeSound(); }

この抽象クラスを継承する具体的なクラスは以下のようになります:

java
class Dog extends Animal { Dog(String name) { super(name); } @Override void makeSound() { System.out.println(name + " says: Woof!"); } }

使用例とメリット

java
public class Main { public static void main(String[] args) { Animal myDog = new Dog("Pochi"); myDog.sleep(); // 共通の振る舞い myDog.makeSound(); // サブクラス固有の振る舞い } }

このように、Animalという抽象クラスを通じて「すべての動物がsleepできるが、soundの出し方はそれぞれ異なる」という設計意図を表現できます。


抽象クラスを使うべき場合

  • 共通の実装を持たせたい場合(例:コンストラクタや共通メソッド)

  • 一部のメソッドだけを抽象化し、残りは具体的に定義したい場合

  • 多重継承が不要な場合(Javaではクラスは単一継承のみ)


補足:抽象クラスとインターフェースの違い(簡単に)

特徴 抽象クラス インターフェース
継承数 単一継承のみ 複数実装可能
フィールドの定義 可能 原則として public static final の定数のみ
コンストラクタ 定義可能 定義不可
共通実装の保持 可能 Java 8以降はdefaultメソッドで部分的に可能

生成日:2025/05/03