我知道类中有一个方法列表。我也知道动态调度的机制。但是我对静态调度感到困惑。静态方法在哪里。全局哈希表中是否有静态方法。以及静态调度如何工作。流程如何?
答案 0 :(得分:4)
您正在混淆两个独立的概念。
静态分派是指在运行时调用方法主体的方式。如果您的类可能具有子类或任何对象,而您所知道的仅仅是它符合某种协议,则必须使用动态分配,这意味着您必须在表中查找方法的地址(称为vtable或见证表),然后跳转到该位置。如果编译器确切知道它具有哪种对象,例如struct
,final
类或类中的final
方法,它知道该方法不能被覆盖,因此可以直接跳转到其地址而无需进行查找。
声明为static
的方法是类型方法。将在类型本身而不是类型的实例上调用它,即在方法self
内引用类型而不是类型的实例。
static
方法不能被覆盖,因此编译器始终在编译时知道地址,并将对其使用静态分配。不需要任何类型的哈希表或见证表。