Code that uses an object should not have to know how it works inside. Abstraction exposes what an object does and hides how it does it, like using a List through add and get without caring about its internal layout. Use an abstract class or an interface when several classes do the same job differently, like UPI and card payments that each implement pay(). People often confuse it with encapsulation, which is about hiding data, not hiding implementation.