Javaの抽象クラスとポリモーフィズムを完全解説!初心者でもわかるオブジェクト指向の基本
生徒
「Javaの抽象クラスってなんですか?インターフェースとどう違うんですか?」
先生
「いい質問ですね。抽象クラスは、共通の処理や定義をまとめるための土台になるクラスなんです。」
生徒
「じゃあ、ポリモーフィズムってどう関係あるんですか?」
先生
「それも重要なポイントです。抽象クラスを使うことで、ポリモーフィズムを実現しやすくなるんですよ。詳しく解説していきますね。」
1. Javaの抽象クラスとは?基本を理解しよう
Javaの抽象クラス(abstract class)とは、共通する処理やプロパティを定義するための設計図のようなクラスです。抽象クラスは直接インスタンス化できず、必ず継承して使います。
例えば、動物という抽象的な概念を表す「Animal」クラスを作成し、そこから「Dog」や「Cat」などの具象クラスに継承させることで、共通の処理を統一できます。
抽象クラスでは、抽象メソッド(abstract method)を定義することができ、これによりサブクラスでの具体的な実装を強制することが可能になります。
2. 抽象クラスの基本構文と使用例
Javaで抽象クラスを定義するには、abstractキーワードを使います。以下に基本的な使用例を紹介します。
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
abstract void makeSound();
void eat() {
System.out.println(name + " is eating.");
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
}
@Override
void makeSound() {
System.out.println(name + " says: ワンワン!");
}
}
このように、抽象クラスAnimalはmakeSoundという抽象メソッドを持ち、それをDogクラスで実装しています。
3. 実行結果を見てみよう
では、実際に上記のDogクラスを使って動作を確認してみましょう。
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog("ポチ");
myDog.makeSound();
myDog.eat();
}
}
ポチ says: ワンワン!
ポチ is eating.
4. ポリモーフィズム(多態性)との関係
Javaの抽象クラスを使う最大のメリットの1つが、ポリモーフィズム(Polymorphism)の実現です。
ポリモーフィズムとは、「同じ型(親クラス)を使って、異なる振る舞い(サブクラスの実装)を実行できる」というオブジェクト指向の基本概念です。
たとえば、Animal型の変数にDogやCatなどのインスタンスを代入して、共通のメソッドmakeSound()を呼び出すことで、それぞれのクラスに応じた動作を実行できます。
5. 具体的なポリモーフィズムの例
class Cat extends Animal {
Cat(String name) {
super(name);
}
@Override
void makeSound() {
System.out.println(name + " says: ニャーニャー!");
}
}
public class Main {
public static void main(String[] args) {
Animal[] animals = {
new Dog("ポチ"),
new Cat("ミケ")
};
for (Animal a : animals) {
a.makeSound();
a.eat();
}
}
}
ポチ says: ワンワン!
ポチ is eating.
ミケ says: ニャーニャー!
ミケ is eating.
このように、配列Animal[]でポリモーフィズムを活用することで、コードを簡潔かつ拡張性の高い形に保てます。
6. 抽象クラスとインターフェースの違い
Javaでは、抽象クラスとインターフェースの両方が継承の仕組みを持っていますが、役割が異なります。
- 抽象クラス:共通のロジック(フィールドや具象メソッド)を持たせたいときに使う
- インターフェース:契約(メソッド定義)だけを提示して、複数の型に実装させたいときに使う
たとえば、Animalという抽象クラスにはnameフィールドやeatのような実装付きの共通処理を記述できますが、インターフェースにはフィールドを持つことはできません(定数以外)。
7. 抽象クラスが役立つシーンとは?
抽象クラスは、以下のようなケースで特に効果的です。
- サブクラスで共通の初期化処理をまとめたいとき
- 共通のロジックを継承させつつ、クラスごとに違う振る舞いをもたせたいとき
- 複数のクラスに一貫したインターフェースを提供したいとき
ポリモーフィズムを意識した設計において、抽象クラスは非常に重要な役割を果たします。
8. 抽象クラスとポリモーフィズムの理解がJava上達のカギ
Javaにおける抽象クラスの役割やポリモーフィズムの使い方を理解することは、オブジェクト指向プログラミングを正しく設計・実装するうえで欠かせません。
初心者のうちは、インターフェースとの違いに戸惑うかもしれませんが、実際にコードを書いて動かしてみることで、理解が深まっていくはずです。
継承・抽象クラス・ポリモーフィズムというJavaの基本をしっかりと身につけて、柔軟で拡張性の高いコードが書けるようになりましょう!