// Animalクラスの定義
class Animal {
// makeSoundメソッド
void makeSound() {
System.out.println("音を鳴らします");
}
}
// Dogクラスの定義 (Animalクラスを継承)
class Dog extends Animal {
// makeSoundメソッドをオーバーライド
@Override
void makeSound() {
System.out.println("ワンワン");
}
}
// Catクラスの定義 (Animalクラスを継承)
class Cat extends Animal {
// makeSoundメソッドをオーバーライド
@Override
void makeSound() {
System.out.println("ニャー");
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Animalクラスのインスタンスを作成
Animal genericAnimal = new Animal();
// AnimalクラスのmakeSoundメソッドを呼び出し
genericAnimal.makeSound();
// Dogクラスのインスタンスを作成
Dog myDog = new Dog();
// DogクラスでオーバーライドされたmakeSoundメソッドを呼び出し
myDog.makeSound();
// Catクラスのインスタンスを作成
Cat myCat = new Cat();
// CatクラスでオーバーライドされたmakeSoundメソッドを呼び出し
myCat.makeSound();
}
}
この例では、Animal
クラスには基本の makeSound
メソッドがあり、Dog
クラスと Cat
クラスはそれぞれ makeSound
メソッドをオーバーライドしています。それぞれのクラスのインスタンスを作成し、makeSound
メソッドを呼び出すと、適切な音が表示されます。
オーバーライド
オーバーライド(Override)は、Javaにおいてサブクラスでスーパークラスのメソッドを再定義する機能です。オーバーライドによって、サブクラスはスーパークラスのメソッドをカスタマイズし、特定の動作を提供できます。オーバーライドは主に継承関係にあるクラスで利用されます。
以下はオーバーライドの基本的なルールです。
- オーバーライドするメソッドは、スーパークラスとサブクラスで同じメソッドシグネチャ(メソッド名、引数の型・個数、戻り値の型)を持っている必要があります。
- オーバーライドするメソッドは、
@Override
アノテーションを使用して明示的に指定できます。これはオプションですが、推奨されます。
オーバーライドされたメソッドは、サブクラスのインスタンスで呼び出されると、サブクラスの定義に従って処理が行われます。
オーバーライドにはいくつかのメリットがあります。以下にそのいくつかを挙げてみます。
- カスタマイズ可能性: スーパークラスで提供される標準の動作をサブクラスで変更できます。サブクラスはスーパークラスのメソッドを再定義し、自身の特有の動作を追加または変更できます。
- ポリモーフィズム: オーバーライドはポリモーフィズムをサポートします。これは、同じメソッド名を使用して異なるクラスのオブジェクトで同じメソッドを呼び出せるという概念です。これにより、共通のインターフェースを提供しつつ、各サブクラスで異なる動作を実現できます。
- メンテナンス性: オーバーライドを使用すると、コードのメンテナンスが容易になります。スーパークラスの実装が変更されても、それに依存するサブクラスのメソッドは自動的に新しい実装に適応されます。
- 効果的な利用: スーパークラスで汎用的な実装を提供し、サブクラスでその実装を特殊化することができます。これにより、コードの再利用が促進されます。
- コードの理解容易性: オーバーライドを使用すると、コードが洗練され、理解しやすくなります。メソッドの名前やシグネチャが一貫しているため、コードがどのように機能するかを容易に把握できます。
ただし、オーバーライドを濫用するとコードが複雑になり、理解しにくくなる可能性があるため、適切に利用することが重要です。
オーバーライドとオーバーロードを混同しないように
注意: オーバーライドとオーバーロードの違いに注意してください。
オーバーライド (Override):
- サブクラスがスーパークラスの同じメソッド名、引数リスト、および戻り値型を持つメソッドを再定義することです。
- ポリモーフィズムを実現し、サブクラスでスーパークラスのメソッドをカスタマイズできます。
class SuperClass {
void exampleMethod() {
// スーパークラスの実装
}
}
class SubClass extends SuperClass {
@Override
void exampleMethod() {
// サブクラス独自の実装
}
}
オーバーロード (Overload):
- 同一クラス内で、同じメソッド名であっても引数リストが異なるメソッドを複数定義することです。
- 引数の型や個数が異なる場合に、同じメソッド名を使用して複数のメソッドを作成できます。
class Example {
void overloadedMethod(int x) {
// 引数が整数の場合の実装
}
void overloadedMethod(String str) {
// 引数が文字列の場合の実装
}
}
要点:
- オーバーライドは異なるクラス間で行われ、ランタイム時に動的に解決されます。
- オーバーロードは同じクラス内で行われ、コンパイル時に静的に解決されます。
適切に使用することで、クリーンで保守しやすいコードを実現できます。混同せず、用途に合わせて使い分けましょう。