Вы путаете два отдельных понятия.
Статическая отправка относится к способу вызова тела метода во время выполнения. Если у вас есть класс, который потенциально может иметь подклассы или какой-либо объект, о котором вам известно только то, что он соответствует определенному протоколу, вы должны использовать динамическую диспетчеризацию, что означает, что вы должны искать адрес метода в таблице. (называемый виртуальной таблицей или таблицей свидетелей), а затем перейти к этому месту. Если компилятор точно знает, какой у него объект, например, struct
, final
класс или final
метод в классе, он знает, что метод не может быть переопределен, и поэтому может напрямую переходить к его адресу без выполнения поиска.
Метод, который объявлен static
, является методом типа. Он будет вызываться для самого типа, а не для экземпляра типа, т.е. внутри метода self
относится к типу, а не к экземпляру типа.
static
методы не могут быть переопределены, поэтому компилятор всегда знает адрес во время компиляции и будет использовать для них статическую диспетчеризацию. Нет необходимости в каких-либо хэш-таблицах или таблицах-свидетелях.