= Overload selection followed by dynamic dispatch
To analyze an ordinary overloaded instance call, first enumerate members visible through the receiver's <static type> and choose the applicable signature using argument <static types>. Only then use the receiver's <runtime type> to select the effective override of that signature. This two-stage rule explains why changing a reference's declared type can change the selected overload even when every reference points to the same object. A `super` call selects the inherited implementation according to the language's superclass or linearization rules instead of recursively redispatching to the overriding body.
Back to article page