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");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal型の参照とAnimalオブジェクト
Animal b = new Dog(); // Animal型の参照だがDogオブジェクト
a.move(); // Animalクラスのメソッドが実行される
b.move(); // Dogクラスのメソッドが実行される
}
}実行結果
このプログラムを実行すると、次のような出力が得られます。
Animals can move Dogs can walk and run
解説:なぜこのような結果になるのか
ポイントは変数 b の扱いです。b は Animal 型として宣言されていますが、実際に代入されているのは Dog オブジェクトです。
- コンパイル時: 参照型が
Animalであるため、コンパイラはAnimalクラスにmove()メソッドが存在するかどうかのみを確認します。 - 実行時: JVMがオブジェクトの実際の型(
Dog)を認識し、Dogクラスでオーバーライドされたmove()を呼び出します。
一方、変数 a は参照型もオブジェクトも Animal であるため、Animal クラスの move() がそのまま実行されます。このように、実行時にオブジェクトの実際の型に応じて適切なメソッドが選択される仕組みこそが、ランタイムポリモーフィズムの本質です。
-
Javaの同時実行性 – Thread.yield()メソッドの仕組みと使い方
yield()メソッドとはjava.lang.Thread.yield()メソッドは、現在実行中のスレッドが自発的にCPUの使用権を手放し、より優先度の高い他のスレッドに実行の機会を譲るよう、スレッドスケジューラにヒントを伝えるためのメソッドです。処理に時間がかかっている重要度の低いスレッドよりも、優先して実行すべきスレッドを先に進めたい場面で利用されます。スレッドがyield()を呼び出すと、「自分の実行を一時停止してもよい」という合図がスケジューラに送られます。ただし、この合図を受け入れるか無視するかはスケジューラの判断に委ねられており、必ず譲るとは限らない点に注意が必要です。yield(
-
Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説
destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc