One thing that helped me immensely was Alan Kay's (who practically created the OOP paradigm) email, in which he answered some questions about OOP. Especially this part:
I thought of objects being like biological cells and/or individual
computers on a network, only able to communicate with messages
Now, there are no messages per se in most OO-languages (one notable example is C#). But the idea stands: objects are like biological cells.
Some cells generate hormones, others filter blood, etc. This is their specialization. Their inner workings must not be distrubed -- that's why they have cell membranes.
However, they also need to communicate with other cells. This is why they have receptors -- proteins that stick out of membrane and can detect certain chemicals.
For example, when we are in danger, adrenal gland's cells "send" adrenaline to muscle cells. Muscle cells have receptors that "catch" adrenaline, and upon "receiving" it start
producing more energy.
So the cells are isolated in their work, but open to communication.
OOP paradigm yearns to compose a program from such cells -- objects.
Objects do their one thing and never allow other objects to interfere with their inner workings (this is why we have private and protected properties and methods). However, they also allow pre-defined ways of communication (this is why we have public methods and properties; also interfaces).
Programming in the OOP paradigm means
Coming up with objects which do their one thing and know only what they need to know to do it.
Allowing objects to share what they know in an understandable and reliable way.
Why this is important? Because this modularity gives people a better understanding of code. Principles of OOP aim to make sure that you know what's going on at any given moment. If you change one class, you won't affect the system as a whole. If something goes wrong, you can see where the problem is. This allows for flexible and reliable code -- which is usually what real-world businesses need.