Suppose that B is a subclass of A. It is possible to put an object x of class B into a variable of class A.

Suppose that x is asked to perform a method m that is defined in class A, and that might be overridden in class B.

Dynamic method selection looks in the dispatch table to find m using class B, the class of x as indicated by x's tag.

Static method selection looks in the dispatch table to find m using class A, the class of the variable that holds x. In reality, static method selection can avoid the dispatch table since it knows where methods of class A are located.

Static method selection can, in principle, be done in a dynamically typed language, where variables do not have associated classes. When a method in class A calls another method in class A using static method selection, it avoids the dispatch table and does a direct call to the other method, as it is defined in class A. So it still ignores the tag of the object that performs the method.

Most object-oriented languages do only dynamic method selection.