In fact abstraction means more the than just hiding implementation (it's more to do with Encapsuling).
Abstraction, in OOP concept, means choosing only aspects and behaviors that matters for your problem domain and, so, through the abstraction, you will be able to offer a simple interface (not necessarily a Java Interface) for the user to access/manipulate the class'es instances. Having a simple interface has much to do with encapsuling.
Imagine a cell phone: You have the numeric keyboard, which is a simple interface for the internal eletronic circuits (that means an abstract way to send eletronic pulses to the CPU). Through the Abstraction you could encapsulate/hide the complicated implementation of how the keyboard generates the pulses. The cell phone user doesn't care how the Keyboard generates the pulses to send to the CPU (unless you are an electrical engineer ).
Now try to imagine a Television and answer: How would you model a TV on OOP? (This is part of the abstraction process)
It will depend on what's your problem domain: Will you use a TV object on a Shopping Cart or on a Electronics Factory?
Abstarction is nothing but showing outside view of object rather than its implementation.
The best example is ,
Consider a Display class for an application(say) which displays output .
Here 3 cases arises for display ,the display of application may be GUI or on command line text display or may the data that is retrived from database.
There are 3 different types of display cases for the same problem.
Therefore in order to handle this ,we can create one abstract class as Display and extend this abstract class functionality to 3 diff cases say TextDisplay class ,Gui class,DataStorage class .What so ever case we want we can call that type of class method(overriden) at runtime without affecting to other part of code .