Polymorphism in Java allows an object to take on multiple forms. There are two types of polymorphism: compile-time polymorphism (method overloading) and runtime polymorphism (method overriding). Method overloading involves methods with the same name but different parameters, while method overriding involves subclasses providing their own implementation of a superclass method. Runtime polymorphism determines which version of a method to call based on the object's actual type at runtime. Abstraction in Java allows hiding implementation details and showing only essential functionality through the use of abstract classes and methods.