// 抽象クラス Animal の定義
abstract class Animal {
// 抽象メソッド makeSound() の宣言
public abstract void makeSound();
}
// 具象クラス Dog の定義
class Dog extends Animal {
// makeSound() メソッドの実装
@Override
public void makeSound() {
System.out.println("ワンワン");
}
}
// 具象クラス Cat の定義
class Cat extends Animal {
// makeSound() メソッドの実装
@Override
public void makeSound() {
System.out.println("ニャー");
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Dog クラスのインスタンスを作成して makeSound() メソッドを呼び出す
Dog myDog = new Dog();
myDog.makeSound();
// Cat クラスのインスタンスを作成して makeSound() メソッドを呼び出す
Cat myCat = new Cat();
myCat.makeSound();
}
}
このコードでは、Animal
クラスが抽象クラスとして、makeSound()
メソッドが抽象メソッドとして宣言されています。そして、Dog
クラスと Cat
クラスがそれぞれ Animal
クラスを継承し、makeSound()
メソッドをオーバーライドしています。main
メソッドでは、それぞれのクラスのインスタンスを作成して makeSound()
メソッドを呼び出し、吠え声や鳴き声が表示されることを確認しています。
抽象クラス
抽象クラスは、Javaのオブジェクト指向プログラミングにおいて、また、クラスの設計において共通の機能を提供するための概念です。以下に、抽象クラスの基本概念を解説します。
抽象クラスの定義:
抽象クラスは、abstract キーワードを使用して定義されます。抽象クラスには抽象メソッド(実装がないメソッド)が含まれることがあります。
抽象クラスは直接インスタンスを生成することはできず、具象クラス(実際にインスタンスを生成できるクラス)を通じて利用されます。
abstract class Animal {
// 抽象メソッド
public abstract void makeSound();
}
抽象メソッド:
抽象クラスには抽象メソッドが含まれることがあります。抽象メソッドはメソッドの宣言だけがあり、実際の実装はサブクラスに委ねられます。
抽象メソッドは abstract キーワードを含み、末尾にセミコロンがつきます。
abstract class Animal {
// 抽象メソッド
public abstract void makeSound();
}
サブクラスの継承と実装:
抽象クラスを継承するサブクラスは、抽象メソッドをオーバーライド(実装)する必要があります。これが強制され、サブクラスが共通の機能を提供できるようになります。
class Dog extends Animal {
// 抽象メソッドの実装
@Override
public void makeSound() {
System.out.println("ワンワン");
}
}
抽象クラスのインスタンス化の制約:
抽象クラスは直接インスタンスを生成できません。具象クラスを通じて、サブクラスのインスタンスを生成して使用します。
Animal myAnimal = new Dog(); // これは有効
Animal invalidAnimal = new Animal(); // これはエラー
多重継承の制約:
Javaでは単一継承しか許されていません。抽象クラスを介した継承は、他のクラスとの多重継承の代替手段として使用されます。
abstract class Animal { /* ... */ }
class Dog extends Animal { /* ... */ }
// class Cat extends Animal, SomeOtherClass; // これはエラー(多重継承が不可)
抽象クラスは、クラス間で共通の機能や振る舞いを抽象化し、サブクラスに共通の基盤を提供する際に有用です。これによりコードの再利用性が向上し、メンテナンスや拡張がしやすくなります。