2

ConcreteClassを継承するテストコードがありAbstractClassForInterface1ます。のコンストラクター用に生成されたsmaliコードConcreteClass

# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 4
    invoke-direct {p0}, Lorg/ucomb/AbstractClassForInterface1;-><init>()V 

    return-void
.end method

p0ConcreteClassこれはインスタンス化からのものであるため、実際にはタイプのインスタンス化されたオブジェクトです。

new-instance v0, Lorg/ucomb/ConcreteClass1;

invoke-direct {v0}, Lorg/ucomb/ConcreteClass1;-><init>()V

v0オブジェクトにメソッドがあることは簡単に理解できますLorg/ucomb/ConcreteClass1;-><init>()V

次に、本文で、を使用invoke-directp0てスーパークラスのコンストラクターを次のように呼び出す理由を説明します。

invoke-direct {p0}, Lorg/ucomb/AbstractClassForInterface1;-><init>()V

invoke-direct仮想メソッド解決なしでメソッドを呼び出すことになっているのではありませんか?

4

1 に答える 1

2

ダイレクト メソッドを呼び出す場合、呼び出される正確なメソッドが指定されます。この場合、Lorg/ucomb/AbstractClassForInterface1;-><init>()V. これは仮想テーブル ルックアップではありませんAbstractClassForInterface1。コンストラクタであることが保証されています。それが仮想テーブル ルックアップの場合、ConcreteClass1 クラス<init>()Vのメソッドであるメソッドの最も特化したオーバーライドに解決されます。<init>()V

于 2013-01-10T07:40:22.493 に答える