抽象クラスとは、クラス自体を直接オブジェクトとして生成できない(インスタンス化できない)クラスです。主に、共通の基盤となる振る舞いを定義し、子クラスにその実装を強制するために使われます。
1. 定義と特徴
- キーワード: クラス宣言の前に
abstractキーワードを付けます。 - インスタンス化禁止:
new 抽象クラス名()はできません。必ず子クラスを作成し、その子クラスのオブジェクトとして利用します。 - 抽象メソッド: 抽象クラスは、抽象メソッドを持つことができます。
- 具象メンバー: 抽象クラスは、通常のクラスと同じように、具象メソッド(処理内容を持つメソッド)やフィールド(変数)を持つことができます。
2. 抽象メソッド (abstract method)
抽象メソッドとは、メソッドの宣言のみを行い、具体的な処理内容(本体 {...})を持たないメソッドです。
Java
// 抽象メソッドには abstract をつけ、本体を記述しない
public abstract void draw();
- ルール: 抽象メソッドを持つクラスは、必ず抽象クラスでなければなりません。
🤝 3. 抽象クラスの継承と実装
抽象クラスを継承する子クラスには、以下のルールがあります。
- 抽象メソッドの実装義務: 抽象クラスを継承した具象(非抽象)子クラスは、親クラスのすべての抽象メソッドをオーバーライドし、実装する義務があります。
- 子クラスも抽象化: もし子クラスが親の抽象メソッドのいくつかを実装しない場合、その子クラス自身も
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 スプレッドシートにエクスポート

