What is meant by dynamic dispatch in Java […]?
Think of "dispatch" as "determining which method to call".
The "dynamic" part simply says that it is determined at runtime. That is, which method is to be called is determined at runtime.
why do we need it in the context of inheritance
Without inheritance / polymorphism we wouldn't need this. The type of an expression would be decidable at compile time, and which method that would have been called at runtime would be known when compiling the program.
With inheritance / polymorphism we don't know the concrete runtime type of an expression, thus which method to be called must be "dynamically" determined during runtime.
Without dynamic dispatch, virtual methods wouldn't make sense, which is central for abstraction and encapsulation.
Recommended reading: Wikipedia article on Dynamic Dispatch