Java の静的バインディングと動的バインディングを理解する
Java プログラムの実行には、コンパイルと実行 (解釈) の 2 つのステップが必要です。同時に、Java はオブジェクト指向プログラミング言語です。サブクラスと親クラスが同じメソッドを持ち、サブクラスが親クラスのメソッドをオーバーライドする場合、プログラムが実行時にメソッドを呼び出すとき、親クラスのメソッドを呼び出す必要がありますか、それともサブクラスのオーバーライドされたメソッドを呼び出す必要がありますか? Java を初めて学習するときに遭遇する問題は次のとおりです。ここではまず、どのメソッドを呼び出すか、または変数の操作をバインディングと呼ぶかを決定します。
Java には 2 つのバインディング メソッドがあり、1 つは静的バインディングであり、早期バインディングとも呼ばれます。もう 1 つは動的バインディングであり、遅延バインディングとも呼ばれます。
プログラム バインディングの概念:
バインディングは、メソッド呼び出しと、そのメソッドが配置されているクラス (メソッド本体) との関連付けを指します。 Java の場合、バインディングは静的バインディングと動的バインディング、または早期バインディングと遅延バインディングに分けられます。他のリンカー。例: C. Java の場合、プログラムのコンパイル中のバインディングとして理解できます。特に、Java の Final、static、private、およびコンストラクター メソッドのみが早期バインディングです
動的バインディング (遅延バインディング ランタイム バインディング):
遅延バインディング:実行時の特定のオブジェクトのタイプ。
言語が遅延バインディングを実装する場合、実行時にオブジェクトの型を決定し、それぞれ適切なメソッドを呼び出す何らかのメカニズムも提供する必要があります。つまり、この時点ではコンパイラはまだオブジェクトの型を認識していませんが、メソッド呼び出しメカニズムはそれ自体で調査して、正しいメソッド本体を見つけることができます。言語が異なれば遅延バインディングの実装方法も異なります。次のように考えてください。それらはすべて、何らかの特別な種類の情報をオブジェクトに挿入する必要があります。
動的バインディングのプロセス:
仮想マシンはオブジェクトの実際の型のメソッドテーブルを抽出します
仮想マシンはメソッドシグネチャを検索します
メソッドを呼び出します
バインディング関連の概要:
理解した後3 つの概念を検討した結果、Java は遅延バインディングに属することがわかりました。 Java では、ほとんどすべてのメソッドが実行時に動的にバインドされるメソッドはサブクラスまたは基本クラスに属します。ただし、静的メソッドと最終メソッドは継承できないため、コンパイル時に値が決定される特殊なメソッドもあります。特に注意すべき点は、プライベートに宣言されたメソッドとメンバー変数はサブクラスに継承できないことです。すべてのプライベート メソッドは暗黙的に Final として指定されます (このことから、メソッドを Final 型として宣言することは、メソッドが上書きされるのを防ぐためであることがわかります)。 Java で動的バインディングを効果的に無効にすることです)。 Java の遅延バインディングは JVM によって実装されます。明示的に宣言する必要はありませんが、C++ ではメソッドが遅延バインディングを持つことを明示的に宣言する必要があります。 Java のアップキャストまたはポリモーフィズムは動的バインディングを利用して実現されるため、動的バインディングを理解することはアップキャストとポリモーフィズムも意味します。
Java のメソッドの場合、事前にバインドされている Final、static、private、およびコンストラクター メソッドを除き、他のすべてのメソッドは動的にバインドされます。動的バインディングは通常、親クラスとサブクラスの変換宣言の下で発生します:
例: Parent p = new Children();
具体的なプロセスは次のとおりです:
1. コンパイラは、宣言された型とメソッドをチェックします。オブジェクト名。 x.f(args) メソッドを呼び出し、x がクラス C のオブジェクトとして宣言されているとします。その場合、コンパイラーはクラス C 内の f という名前のすべてのメソッドと、クラス C
2 のスーパークラスから継承された f メソッドを列挙します。次に、コンパイラはメソッド呼び出しで提供されたパラメータの型をチェックします。 f という名前のすべてのメソッドの中に、呼び出しで指定されたパラメーターの型に最も一致するパラメーターの型がある場合、このメソッドは、プログラムの実行時に「オーバーロード解決」と呼ばれます
3。が動的バインディングを使用して呼び出される場合、仮想マシンは、x が指すオブジェクトの実際の型と一致するバージョンのメソッドを呼び出す必要があります。実際の型が D (C のサブクラス) であると仮定します。クラス D が f (String) を定義している場合、メソッドが呼び出されます。それ以外の場合は、メソッド f (String) が D のスーパークラスで検索されます。
問題について考える:
タスクを完了するためのメソッドをメソッドユーザーに提供する方法。ユーザーに特別な要件があり、独自の方法をカスタマイズできる場合はどうすればよいでしょうか?
関連する知識:
子クラスと親クラス、インターフェイス、上向き変換、動的バインディング
具体的なコード:
package com.chengxuyuanzhilu; public interface MyInterfaces { void doting(); } package com.chengxuyuanzhilu; public class Drink implements MyInterfaces { @Override public void doting() { System.out.println("我在喝水"); } } package com.chengxuyuanzhilu; public class Eat implements MyInterfaces { @Override public void doting() { System.out.println("我在吃东西"); } } package com.chengxuyuanzhilu; public class Run implements MyInterfaces { @Override public void doting() { System.out.println("我在奔跑"); } } package com.chengxuyuanzhilu; public class TestDynamicBind { public static void main(String[] args) { MyInterfaces my = null; my = new Eat(); bind(my); my = new Drink(); bind(my); my = new Run(); bind(my); } static void bind(MyInterfaces my){ my.doting(); } }
以上がこの記事の全内容です、皆様の学習にお役に立てれば幸いです。
Java の静的バインディングと動的バインディングの理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。
