Abstraction means concentrating on what an object is and does, before making any decisions about how the object will be implemented. Thus, abstractly, we define a deck of cards and the operations we want to provide. (Clearly, if our abstraction is to be useful, it had better capture the attributes and operations of a real-world deck.) Once we have decided on the attributes and operations, we can actually implement them.
Encapsulation, which is also referred to information hiding, means separating and hiding the implementation details of the chosen abstract attributes and behavior from outside users of the object. The external side of an object should provide only the necessary interface to users of the object for activating internal procedures. Imposing a strict inside-outside discipline when creating objects is really another way of saying that the object successfully encapsulates all implementation details. In our deck-of-cards example, encapsulation means that the user need never know how we have internally modeled the deck or how an operation, such as shuffling, is performed; the user need only know how to activate the given operations.
Information hiding refers to the principle that how a class in internally constructed is not relevant to any programmer who wishes to use the class. That is, the implementation can and should be hidden from all class users precisely to ensure that the class is not altered or compromised in any way. All that a programmer need to know to use the class correctly should be provided by the interface.