Encapsulation, abstraction, inheritance and polymorphism are the four, and each buys something different. Encapsulation keeps an object's data and the code that changes it together, behind a guarded door. Abstraction shows what an object does and hides how it does it. Inheritance lets one class build on another. Polymorphism lets one piece of code work with several types.
These are not four independent features. Encapsulation and abstraction are two views of the same boundary. One hides state, the other hides steps. Inheritance is only one route to polymorphism, and often not the best one.
Treat them as tools, not as goals. Applying all four to every class produces deep hierarchies and wrapper types that buy nothing. The real payoff is narrow and measurable. A change lands in one file instead of twenty, and a new case plugs in without touching old code.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓