Which of these best describes abstraction in OOP?
Hiding implementation details while exposing only the necessary parts.
Enabling a subclass to inherit from a superclass.
Creating objects without any specific properties.
Allowing multiple objects to take on different forms.