4

プライベート メソッドを静的にする方法と、パブリック メソッドを動的にバインドする方法について少し混乱しています。

4

5 に答える 5

9

動的バインディングとは、どのコードを実行するかが実行時に決定されることを意味します。これがポリモーフィズムの基本です。

パブリック、パッケージ アクセス、および保護されたメソッドは動的にバインドされます。サブクラスはメソッドをオーバーライドし、代替の実装を提供できます。プライベート メソッドはオーバーライドできないため、動的バインディングは必要ありません。

静的メソッドは、各オブジェクトに固有ではなく、クラス自体で定義されるため、動的にバインドされません (名前にヒントがあります)。

于 2012-07-19T18:02:04.227 に答える
6

動的バインディングまたは遅延バインディング

動的バインディングとは、コンパイラが呼び出しを解決できず、バインディングが実行時にのみ行われる場合を指します。これを理解しようとしましょう。という名前のクラスがあり、それを拡張するSuperClassという名前の別のクラスがあるとします。型のオブジェクトにも参照を割り当てることができるようになりましSubClassた。でオーバーライドするメソッド (たとえば) がある場合、参照でのそのメソッドの呼び出しは実行時にのみ解決できます。これは、コンパイラがこの参照が指しているオブジェクトのタイプを確認できないためです。ランタイム。SuperClassSubClasssomeMethod()SuperClassSubClassSuperClass

...
SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();
...

superClass1.someMethod(); // SuperClass version is called
superClass2.someMethod(); // SubClass version is called
....

ここでは、 と の両方のオブジェクトが型のみを参照しているにもかかわらず、superClass1実行時にこれらはそれぞれ型 SuperClass と のオブジェクトを参照していることがわかります。superClass2SuperClassSubClass

したがって、コンパイラはコンパイル時に、someMethod()これらの参照でのメソッドの呼び出しが実際にメソッドのどのバージョン (スーパー クラス バージョンまたはサブ クラス バージョン) を参照しているかを確認できません。

したがって、Java の動的バインディングは、実際のオブジェクト タイプに基づいてメソッド呼び出しをバインドするだけであることがわかります (サブクラスでオーバーライドできるため、継承されたメソッドのみが継承されるため、コンパイラは呼び出すメソッドのバージョンがわからない可能性があります)。オブジェクト参照の宣言された型ではありません。


静的バインディングまたは事前バインディング

コンパイラがコンパイル時にのみバインディングを解決できる場合、そのようなバインディングは静的バインディングまたは早期バインディングと呼ばれます。すべてのインスタンス メソッド呼び出しは常に実行時に解決されますが、すべての静的メソッド呼び出しはコンパイル時に解決されるため、静的メソッド呼び出しの静的バインディングがあります。静的メソッドはクラスメソッドであり、クラス名自体を使用してアクセスできるため (実際には、オブジェクト参照を使用するのではなく、対応するクラス名のみを使用して使用することをお勧めします)、したがって、それらへのアクセスを解決する必要があります。コンパイル時の型情報のみを使用してコンパイル時に。これが、静的メソッドを実際にオーバーライドできない理由です。詳細 - Java で静的メソッドをオーバーライドできますか?

Java のすべてのメンバー変数へのアクセスは、Java がメンバー変数のポリモーフィックな動作をサポートしていない (実際には推奨しない) ため、静的バインディングに従います。

[この議論とは別に、静的(上記のリンクで述べたように)、 Java のプライベートメソッドと最終メソッドをオーバーライドすることはできません。]

于 2012-07-19T18:36:09.260 に答える
0

静的メソッドはクラスレベルのメソッドであるため、uはクラス名からのみアクセスできますが、メソッドはパブリックである必要があります

于 2012-07-19T18:04:53.240 に答える
0

メソッドthis内で参照が必要ない場合は、それを作成しても問題ありません。どちらの場合も、メソッドを動的にバインドする必要はないため、実装レベルでは、どちらを選択するかはまったく関係ありません。ただし、メソッドをマークすると、メソッドがオブジェクトの状態に依存しないことが明確になるため、読みやすくなります。privatestaticprivatestatic

于 2012-07-19T18:35:58.433 に答える