👻 抽象クラス (abstract class) とは

抽象クラスとは、クラス自体を直接オブジェクトとして生成できない(インスタンス化できない)クラスです。主に、共通の基盤となる振る舞いを定義し、子クラスにその実装を強制するために使われます。

1. 定義と特徴

  • キーワード: クラス宣言の前に abstract キーワードを付けます。
  • インスタンス化禁止: new 抽象クラス名() はできません。必ず子クラスを作成し、その子クラスのオブジェクトとして利用します。
  • 抽象メソッド: 抽象クラスは、抽象メソッドを持つことができます。
  • 具象メンバー: 抽象クラスは、通常のクラスと同じように、具象メソッド(処理内容を持つメソッド)やフィールド(変数)を持つことができます。

2. 抽象メソッド (abstract method)

抽象メソッドとは、メソッドの宣言のみを行い、具体的な処理内容(本体 {...})を持たないメソッドです。

Java

// 抽象メソッドには abstract をつけ、本体を記述しない
public abstract void draw(); 
  • ルール: 抽象メソッドを持つクラスは、必ず抽象クラスでなければなりません。

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

抽象クラスを継承する子クラスには、以下のルールがあります。

  1. 抽象メソッドの実装義務: 抽象クラスを継承した具象(非抽象)子クラスは、親クラスのすべての抽象メソッドをオーバーライドし、実装する義務があります。
  2. 子クラスも抽象化: もし子クラスが親の抽象メソッドのいくつかを実装しない場合、その子クラス自身も abstract クラスとして宣言する必要があります。

💻 抽象クラスの利用例

Java

// 親クラス: 図形操作の共通基盤を定義
abstract class Shape {
    // 具象メソッド(すべての図形に共通の処理)
    public void printInfo() {
        System.out.println("これは図形オブジェクトです。");
    }

    // 抽象メソッド(子クラスで異なる処理を強制)
    public abstract double calculateArea(); // 面積計算は子クラスに任せる
}

// 子クラス: Shapeを継承し、抽象メソッドを実装
class Circle extends Shape {
    private double radius = 5.0;

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

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

項目抽象クラス (abstract class)インターフェース (interface)
インスタンス化✕ 不可✕ 不可
多重継承/実装✕ 単一継承のみ⚪︎ 多重実装が可能
具象メンバー⚪︎ フィールドや処理を持つメソッドを持てる✕ (Java 8以降のdefault/static以外は不可)
目的共通の基盤となるロジックとフィールドを定義し、拡張する。クラスに「あるべき機能」(契約)だけを定義し、多重の役割を持たせる。

Google スプレッドシートにエクスポート