Abstract classes in Java are used as templates for creating concrete classes and cannot be instantiated directly. They provide a common interface and implementation for subclasses through abstract and concrete methods. For example, an abstract Shape class can define methods like getColor() while making getArea() abstract, requiring subclasses like Circle to implement it. Abstract classes allow for code reuse and polymorphism, serving as a blueprint for related classes to customize as needed.