Java
 Computer >> コンピューター >  >> プログラミング >> Java

マルチレベル継承で学ぶJavaのランタイムポリモーフィズム(実行時多態性)

メソッドのオーバーライドは、ランタイムポリモーフィズム(実行時多態性)の代表的な例です。メソッドオーバーライドでは、サブクラスがスーパークラスと同じシグネチャ(メソッド名・引数・戻り値の型)を持つメソッドを再定義します。

ここで重要なのは、処理が決定されるタイミングです。コンパイル時には、変数の参照型に対してチェックが行われます。しかし実行時になると、JVM(Java仮想マシン)が実際のオブジェクト型を判別し、そのオブジェクトに属するメソッドを実行します。これにより、同じ参照型の変数でも、代入されているオブジェクトによって異なる動作が実現されます。

マルチレベル継承でのオーバーライド

メソッドのオーバーライドは、マルチレベル継承(親→子→孫といった多段階の継承)のどの階層でも行うことができます。以下のサンプルコードで、この概念を確認してみましょう。

サンプルコード

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}
class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}
class Puppy extends Dog {
    public void move() {
        System.out.println("Puppy can move.");
    }
}
public class Tester {
    public static void main(String args[]) {
        Animal a = new Animal(); // Animal型の参照かつAnimal型のオブジェクト
        Animal b = new Puppy();  // Animal型の参照だがPuppy型のオブジェクト
        a.move(); // Animalクラスのmove()が実行される
        b.move(); // Puppyクラスのmove()が実行される
    }
}

実行結果

Animals can move
Puppy can move.

コードの解説

このプログラムでは、AnimalDogPuppy という3段階のマルチレベル継承が構成されており、各クラスがmove()メソッドをオーバーライドしています。

  • 変数aの場合: 参照型もオブジェクト型もAnimalであるため、Animalクラスのmove()が実行され、「Animals can move」が出力されます。
  • 変数bの場合: 参照型はAnimalですが、実際のオブジェクトはPuppyです。コンパイル時にはAnimal型としてチェックされますが、実行時にJVMがオブジェクトの実際の型(Puppy)を判別し、最も具体的な階層にあるPuppyクラスのmove()が呼び出されます。

このように、JVMは継承階層の中から実際のオブジェクトのクラスに定義されたメソッドを優先的に実行します。もしPuppyクラスがmove()をオーバーライドしていなければ、親クラスであるDog、さらに遡ってAnimalのメソッドが実行される仕組みです。これがランタイムポリモーフィズムによる柔軟なメソッド呼び出しの動作です。

  1. EclipseでJavaFXをセットアップする方法|Maven依存関係とJARの手動追加を解説

    EclipseでJavaFXアプリケーションを開発するためには、あらかじめ環境構築が必要です。この記事では、Maven依存関係を利用する方法と、必要なJARファイルを手動で追加する方法という2つのアプローチをわかりやすく解説します。事前準備セットアップを始める前に、お使いのシステムにEclipseとJava(JDK)が正常にインストールされていることを確認してください。これらが揃っていれば、どちらの方法でもスムーズにJavaFX環境を構築できます。方法1:Maven依存関係を使ったセットアップMavenを利用してJavaFX環境を構築する場合は、まずEclipseで通常のJavaプロジェクトを

  2. Javaの継承の種類をわかりやすく解説!3つのパターンと具体例

    Javaでサポートされる3種類の継承Javaにおける継承(Inheritance)は、既存のクラスのプロパティやメソッドを別のクラスが引き継ぐことで、コードの再利用性を高め、保守性の高いプログラムを実現する重要な仕組みです。Javaでは、主に以下の3種類の継承パターンが利用できます。1. 単一レベル継承(Single Level Inheritance)ひとつのクラスが、別の単一のクラスからプロパティやメソッドを引き継ぐ、最も基本的な継承形式です。例:クラスBがクラスAを継承する。2. 多段階継承(Multilevel Inheritance)あるクラスが、すでに別のクラスを継承しているクラス