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

p0实际上是 type 的实例化对象ConcreteClass,因为它来自实例化:

new-instance v0, Lorg/ucomb/ConcreteClass1;

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

并且很容易理解,对象v0有方法Lorg/ucomb/ConcreteClass1;-><init>()V

然后在正文中,为什么要像这样使用invoke-directonp0来调用超类的构造函数:

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

invoke-direct应该在没有虚拟方法解析的情况下调用方法吗?

4

1 回答 1

2

调用直接方法时,会指定被调用的确切方法。在这种情况下,Lorg/ucomb/AbstractClassForInterface1;-><init>()V。这不是虚拟表查找 - 它保证是AbstractClassForInterface1构造函数。如果它是一个虚拟表查找,它将解析为该<init>()V方法的最专门的覆盖,这将是<init>()V您的 ConcreteClass1 类中的方法。

于 2013-01-10T07:40:22.493 回答