@Rob's on the right track here for a good example. Take a look at the collections objects found in C# or Java.
I think I can expand a bit to make this clearer as to why this is a good example...there's many ways to do lists, but there's a few basic operations that are in common. These operations all vary with the specific implementation, but the caller shouldn't care. All the caller should care about is the list has certain functions and knows how to do it.
For instance, let's say we had a robot that took our groceries and put them all away for us.
while there are items in the bag's list
remove the next item from the bag
put away the item
put in something more code-ish
while (item = bag.NextItem())
{
bag.Remove(item);
robot.PutAway(item);
}
Now, do you care how the list of items in the bag is implemented? No, not at all. You just care that you can find the next item and take it out of the bag. Whether the bag is a double linked list, a single linked list, whatever, it doesn't matter.
So, the developer writing that hideous PutAway algorithm doesn't care how they find items, they just care that they have the item. The bag doesn't care what happens with the items, it just cares that it can hold them for a while, then they get taken away. And that developer gets to go home for the weekend. :)
Of course, this is a painfully simple example, there's a whole lot of holes you can poke in it.