То, что функция класса final
не может быть переопределена, не означает, что она статически отправлена. Финальная функция класса переопределяет не финальную функцию класса суперкласса. Такой вызов метода должен отправляться динамически.
static
это просто псевдоним для final class
. Они ведут себя одинаково:
class C1 { class func foo() {} }
class C2: C1 { override final class func foo() {} }
class C3: C1 { override static func foo() {} }