0

メソッドmを持つインターフェイスIと、動作が異なる2つの実装クラスAとBがあるという状況があります。

AとBのオブジェクトは、メソッドではなく、値と参照型にメモリのみを使用します。タイプIの変数に格納されているAのオブジェクトは、参照(ポインターサイズのオーバーヘッド)とオブジェクトのサイズとともに格納されます。ここで、メソッドmが呼び出されます。ここで、この1ビットの情報はどこに保存されますか?クラスBからではなく、クラスAのメソッドmを呼び出す必要がありますか?

この質問はまた、C++仮想メソッドで私を悩ませます。

interface I { void m(); }
class A implements I { void m(){println("a");} }
class B implements I { void m(){println("b");} }
4

2 に答える 2

1

実際の実行コード(JIT)では、少なくともHotspot JVMが正しいメソッドを直接呼び出すことができる場合があります(事実上、仮想化を解除します)。クラスのロードも処理するため、クラス階層は既知であるため、周囲にBのインスタンスがない場合は、たとえばAであると確信できます(単相)。後でBのインスタンスが作成された場合、最適化を解除して、いくつかの最適化を実行できます(2つの選択肢のみ、バイモーフィック)。

于 2012-05-19T20:13:49.413 に答える
1

C++ では、各オブジェクトには通常、関数アドレスのテーブル ( vtable ) への隠しポインター ( vptr ) が含まれています。クラスごとに 1 つの vtable があり、その仮想関数実装のアドレスが含まれています。http://en.wikipedia.org/wiki/Virtual_method_tableを参照してください。

Javaも同様の方法で実装していると思います(ただし、これについては調べていません)。

于 2012-05-19T19:58:08.223 に答える