This is really the toughest thing in programming I think. Took me ages to get it and even then there are always different ways to approach it within languages so there’s a certain amount of it that I think is pure confidence in your ability to do it.
I actually think that if you’ve studied much SQL then there are huge parallels between standard relational databases and object orientated programming, but I’m not sure how much that helps.
I spent ages trying to help a mate to understand these concepts when he ended up in a job that was totally missold to him.
Laying aside dogs cats cars whatever, the main concept of OO is the notion of being able to reuse the code you write by making it as abstract as possible. I guess this is closest to in language when you make a really good idiom or in TV shows when you have a trope because you’ve managed to make a concept that can be deployed again and again in conversation or when writing TV scripts which immediately connects with the audience. If you tried making a new phrase or idea every time you run the risk of it being less well understood. Also the best idioms are the ones that are vaguest (so can be used in the most places) but still clearest to the audience.
So likewise, if you write a piece of code that can convert a paragraph from normal English to encrypted English and you get it so it definitely works every time, you’d want to turn that into an object you could pass around to others or reuse.
At that point you need to work out what the simplest amount of variables you’d need to be able to pass into your code to give the most useful output for the most universal use. And that’s where all the tweaking and personal choices come in. (And within that code you’d look at what things get done over and over and look to reduce that code into a single method/function that is called every time, meaning that as long as that function has no errors, every time it’s called it won’t cause errors.)