Javaの抽象クラスとは?初心者でもわかる普通のクラスとの違いを徹底解説!
生徒
「Javaの抽象クラスって何ですか?インターフェースと何が違うんでしょうか?」
先生
「抽象クラスは、共通の機能を持つクラスの“雛形”として使われるものです。インターフェースとの違いも含めて、基本から解説していきましょう。」
生徒
「普通のクラスとはどこが違うんですか?抽象って何か難しそうです…」
先生
「実は、抽象クラスを使うとコードの再利用性や設計の柔軟性がアップするんですよ。順番に見ていきましょう!」
1. Javaの抽象クラスとは?
Javaの抽象クラス(abstract class)とは、インスタンスを直接生成できない特殊なクラスです。抽象クラスは、共通の機能を定義しつつ、一部のメソッドはサブクラスで実装させるという設計を行う際に使われます。
抽象クラスの中には、「抽象メソッド」と呼ばれる実装の無いメソッドを定義できます。このメソッドは、継承先のクラスで必ずオーバーライドして具体的な処理を記述しなければなりません。
2. 抽象クラスと普通のクラスの違い
Javaの普通のクラス(具象クラス)は、すべてのメソッドが実装されており、newしてインスタンスを生成できます。一方、抽象クラスは未完成のクラスとも言える存在で、直接newすることはできません。
- 具象クラス:すべてのメソッドを実装しており、newできる
- 抽象クラス:実装していないメソッドがあり、newできない
抽象クラスは、「共通処理」と「個別処理」を明確に分けて設計できるため、大規模なシステム設計でも役立ちます。
3. Javaで抽象クラスを定義する方法
Javaで抽象クラスを定義するには、abstractキーワードを使います。以下は基本的な定義例です。
public abstract class Animal {
// 共通処理
public void breathe() {
System.out.println("息をする");
}
// 抽象メソッド(未実装)
public abstract void makeSound();
}
このように、抽象クラスでは通常のメソッド(実装済み)と抽象メソッド(未実装)を混在させることが可能です。
4. 抽象クラスを継承して使う方法
抽象クラスはそのままでは使えないので、サブクラスで継承し、未実装のメソッドをオーバーライドする必要があります。
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("ワンワン");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.breathe();
dog.makeSound();
}
}
息をする
ワンワン
このように、抽象クラスを継承したサブクラスで具体的な処理を実装することで、共通のインターフェースを持ちつつ、クラスごとの振る舞いを変えることができます。
5. 抽象クラスとインターフェースの違い
Javaのインターフェースと抽象クラスはよく似た目的で使われますが、明確な違いがあります。以下の表で比較してみましょう。
- 抽象クラス:継承は1つだけ、実装済みのメソッドも持てる
- インターフェース:複数実装可能、基本的にはメソッド定義のみ
どちらを使うかは、設計方針や柔軟性によって判断します。共通処理を含む場合は抽象クラス、契約の定義だけならインターフェースを使うのが一般的です。
6. 抽象クラスを使うメリットと使いどころ
Javaの抽象クラスを使うことで、以下のようなメリットがあります。
- 共通処理の一元化:コードの重複を防ぐ
- テンプレートとして活用:開発者に実装のルールを示せる
- クラス設計の柔軟性が高まる:継承とポリモーフィズムの組み合わせがしやすい
たとえば、「動物」や「乗り物」などの抽象的な概念を表現したい場合にぴったりです。共通の振る舞いを抽象クラスでまとめ、種類ごとの特徴をサブクラスで定義することで、オブジェクト指向らしい設計ができます。