Method overloading in Java allows methods within a class to have the same name but differ in parameters. It can be done by changing the number or data type of arguments. Method overriding occurs when a subclass contains a method with the same name and parameters as a parent class. It is used for runtime polymorphism through dynamic method dispatch, where a child class object is referred to by a parent class reference variable.