Yes, Riley's answer sounds right. The key thing to realize is that there are two phases to this whole process:
At compile time, the Java compiler must decide which method is the best fit based on the declared type of the object and the declared type of all parameters being passed to the method (since the compiler doesn't know what any actual types will be until runtime.) Then, at runtime, Java does not try to find the best match again (since that process could be slow/inefficient) -- instead it simply checks whether the method that it picked at compile-time was overridden by another method (with the exact same signature) in some subclass (based on the actual type of the object that the method is being invoked on.)