Start here. This is the direct spoken answer to practice first.
Overview
Abstraction is more than hiding details: it decides what a caller should depend on and what remains an implementation choice.
Abstraction is the design practice of exposing the essential behavior a caller needs while hiding implementation details it should not depend on. In Java, an abstraction may be an interface, an abstract class, a concrete class, or simply a well-designed method. A PaymentGateway.authorize contract lets application code request a payment outcome without knowing the provider's HTTP payloads. The useful part is the stable, meaningful contract, not the presence of an interface keyword.