Javaの抽象クラスを継承して具象クラスを作る方法!初心者向け完全ガイド
生徒
「Javaの抽象クラスって、どうやって継承して使うんですか?」
先生
「抽象クラスは、extendsを使ってサブクラスとして継承できますよ。具象クラスでは、抽象メソッドをすべて実装する必要があります。」
生徒
「その実装って、具体的にどう書けばいいんですか?」
先生
「それでは、Javaで抽象クラスを継承して具象クラスを作る方法を、順を追って解説していきましょう!」
1. Javaの抽象クラスとは?
Javaの抽象クラス(abstract class)は、他のクラスで共通の振る舞いや構造をまとめるために使うクラスです。中には抽象メソッド(処理のないメソッド)と通常のメソッド(処理を持つメソッド)の両方を定義できます。
抽象クラス自体は直接インスタンス化できません。そのため、抽象クラスを継承した具象クラス(サブクラス)を作り、そちらで使用します。
2. 抽象クラスの基本構文
Javaで抽象クラスを定義するには、abstractキーワードを使います。以下は基本的な構文です。
abstract class Animal {
public abstract void makeSound(); // 抽象メソッド
public void sleep() {
System.out.println("動物が眠っています");
}
}
makeSound()は抽象メソッドなので、具体的な処理はサブクラスで定義する必要があります。
3. 具象クラスで抽象クラスを継承する
抽象クラスを継承するには、extendsキーワードを使って新しいクラスを作ります。このとき、すべての抽象メソッドをoverrideしなければなりません。
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("ワンワン!");
}
}
このように具象クラス(Dogクラス)で抽象メソッドを実装することで、Dogクラスはインスタンス化可能になります。
4. 実際に使ってみよう
それでは、実際に抽象クラスを継承して作った具象クラスを使うJavaプログラムを見てみましょう。
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // ワンワン!
myDog.sleep(); // 動物が眠っています
}
}
このように、DogはAnimalのサブクラスとして抽象メソッドを実装しているため、実体化でき、共通のsleep()メソッドも使えます。
5. 複数の具象クラスで多様性を持たせる
抽象クラスは、同じ基盤を持った複数のクラスを作成する際にとても便利です。以下はCatクラスも継承した例です。
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("ニャーニャー!");
}
}
このようにすれば、Animal型の変数でDogもCatも扱うことができ、ポリモーフィズム(多態性)を実現できます。
6. 抽象クラスと具象クラスの活用例
例えば、動物園のシステムを作るとしましょう。共通機能はAnimalにまとめて、動物ごとの鳴き声などはDogやCatで分けて実装できます。
以下のようなコードがその例です:
public class Zoo {
public static void main(String[] args) {
Animal[] animals = { new Dog(), new Cat() };
for (Animal a : animals) {
a.makeSound(); // それぞれの動物の鳴き声
a.sleep(); // 共通のsleep()メソッド
}
}
}
7. よくあるエラーと注意点
抽象クラスを使うときに初心者がよく陥るポイントをまとめておきましょう。
- 抽象メソッドの未実装:具象クラスで抽象メソッドをすべて実装しないとエラーになります。
- 抽象クラスのインスタンス化:抽象クラスを
newで直接インスタンス化しようとするとエラーになります。 - アクセス修飾子:抽象メソッドにはアクセス修飾子をつけ忘れないようにしましょう(通常は
public)。
8. 抽象クラスを活かした設計の考え方
抽象クラスを使うことで、ソフトウェア設計がより柔軟で拡張性の高いものになります。共通部分を一箇所に集約し、それぞれの具体的な振る舞いだけをサブクラスで分担すれば、保守性も高く、再利用性にも優れた設計になります。
特に、後から別の動物クラスを追加したくなった場合でも、Animalを継承してmakeSound()さえ実装すれば、既存のコードをほとんど変えずに機能を拡張できます。