Start here. This is the direct spoken answer to practice first.
Overview
The key distinction is when the method is selected and whether a subtype replaces inherited instance behavior.
Overloading means methods share a name but have different parameter lists. The compiler chooses an overload using the declared argument types and the available signatures. Overriding means a subclass provides a new implementation of an inherited instance method with a compatible signature. When code calls that method through a base-class or interface reference, Java selects the override using the object's runtime type. That runtime selection is dynamic dispatch and is the basis of ordinary polymorphism.