Javaの静的バインディングと動的バインディングの違いをわかりやすく解説
バインディング(Binding)とは
バインディングとは、メソッドの呼び出しと、その実際の実装(メソッド本体)との間にリンクを確立する仕組みのことです。Javaのポリモーフィズム(多態性)の概念では、1つのオブジェクトが複数の異なる形態を持つことができ、その形態は「コンパイル時」または「実行時」のいずれかで解決されます。
メソッド呼び出しとメソッド実装のリンクがコンパイル時に解決される場合を「静的バインディング(Static Binding)」、実行時に解決される場合を「動的バインディング(Dynamic Binding)」と呼びます。動的バインディングはオブジェクトそのものを使ってバインディングを解決する一方、静的バインディングはクラスの型やフィールドに基づいて解決を行う点が大きな特徴です。
静的バインディングと動的バインディングの比較表
| No. | 項目 | 静的バインディング | 動的バインディング |
|---|---|---|---|
| 1 | 基本 | コンパイル時に解決される | 実行時に解決される |
| 2 | 解決メカニズム | クラスの型やフィールドを使用する | オブジェクトを使用して解決する |
| 3 | 具体例 | オーバーロード(多重定義) | オーバーライド(再定義) |
| 4 | 対象となるメソッド | private、final、staticなメソッドや変数 | 仮想メソッド(virtualメソッド) |
コード例:静的バインディングと動的バインディング
public class FastFood {
public void create() {
System.out.println("Creating in FastFood class");
}
}
public class Pizza extends FastFood {
public void create() {
System.out.println("Creating in Pizza class");
}
}
public class Main {
public static void main(String[] args) {
FastFood fastFood = new FastFood();
fastFood.create();
// 動的バインディング
FastFood pza = new Pizza();
pza.create();
}
}
実行結果
Creating in FastFood class Creating in Pizza class
コードの解説
最初の呼び出し fastFood.create() では、参照変数とオブジェクトがどちらも FastFood 型であるため、コンパイル時に呼び出すメソッドが確定します。
一方、FastFood pza = new Pizza(); のように、参照変数の型は親クラスの FastFood でも、実際に生成されるオブジェクトは子クラスの Pizza です。この場合、JVMは実行時に実際のオブジェクトの型を判定し、Pizza クラスでオーバーライドされた create() メソッドを呼び出します。これが動的バインディングの典型的な例です。
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って
-
Javaにおける静的バインディングと動的バインディングの違いを徹底解説
静的バインディングと動的バインディングとは?Javaでは、メソッド呼び出しと実際の処理内容を結び付ける(バインドする)タイミングによって、「静的バインディング」と「動的バインディング」の2種類に分けられます。この仕組みを理解することは、ポリモーフィズム(多態性)や継承を正しく扱う上で非常に重要です。静的バインディング(早期バインディング)コンパイルの時点で、どのメソッドや変数が使用されるかが確定できる場合、コンパイラは参照を静的に結び付けます。これが静的バインディングです。具体的には、以下のような要素が静的バインディングの対象となります。static変数・staticメソッド:クラスレベルで管