Abstraction
Abstraction is describing the essential and omitting the irrelevant. Abstraction principle is used when modeling the problem domain using class objects and the interaction between these class objects. Abstraction implores us to describe our design in terms of the problem domain instead of getting bogged down in implementation details.
Inheritance
Inheritance is a mechanism whereby the functionality of existing (base) classes is reused by new (derived) classes. Inheritance allows us to share the data and behavior of one abstraction into another. The derived class reuses the behavior of the base class and overrides such behavior when necessary to create a specialized version of the base class.
Polymorphism
Polymorphism literally means having multiple forms. Using inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. Polymorphism allows a programmer to treat a derived class just like its parent class even though the derived class may have redefined the behavior of its base class.
Encapsulation
Encapsulation is the process by which details that do not contribute to its abstraction are hidden. Encapsulation means hiding of information that is not relevant to the outside world. Encapsulation when applied to design of a class is a technique to hide low-level details of the class from the users of the class. Only what is meaningful to the user of the class is exposed through public members. The rest is kept private and can be changed independently of the users of the class.