Static typing involves checking types at compile time, ensuring consistency before a program runs, while dynamic typing checks types during execution. Examples of statically typed languages include Java and C, whereas Python and Ruby are dynamically typed. The distinction between strongly and weakly typed languages can be ambiguous, with strong typing enforcing stricter type checks compared to weak typing, which allows more flexibility at runtime.