Let's say a ceiling fan is running. From the outside, we can only see the rotation of the fan, but we cannot see how the motor works inside or how the various components are connected. This hidden part is "Abstraction", which the user cannot directly see or understand.
Now, all the components inside the fan are covered by an outer casing, so they cannot be seen from the outside. This outer layer is "Encapsulation".
Data models best to OOP
An IS-A joining data = inheritance. Multiple IS-A joins, multiple inheritance (interfaces in some languages facilitate multiple inheritance)
HAS-A relationship = encapsulation
More often we have HAS-A relationships than IS-A relationships
Very, very simple to comprehend
I hate “prefer encapsulation” or “balance inheritance and encapsulation”. There is no rule. Meaning our code becomes inconsistent