The static type is the type with which a variable is declared or that an expression yields. It is always known at compile time.
The dynamic type is the type of the object in memory that the variable or expression represents. It is not known until run time. The dynamic type of an expression that is neither a reference nor a pointer is always the same as that expression's static type.