Polymorphism in Java can occur at compile-time via method overloading or at run-time via method overriding. Method overloading involves declaring multiple methods with the same name but different parameters within a class. The compiler determines which overloaded method to call based on the number and type of parameters passed. Method overriding occurs when a subclass has a method with the same name and parameters as a method in the parent class. Run-time polymorphism is demonstrated when an object of the subclass is treated as the parent class type and the method call is resolved based on the object's actual type at runtime.