understand the core problem OOP wanted to solve -> uncontrollable mutations of the global state.
OOP took the "control" approach -> "who (which object) is allowed to read or write from/to what (private only the owning object can write and read, public everyone can write/read that property, protected, friend and so on are variations of access permissions)".
Oh and one thing is important too, as soon as it's compile probably there are no more objects just simple machine / assembler code instructions.
The rest is a lot of taste and every language has approach for example ;D
Java and GO both object oriented, automated GC but the language design is very different.
I would recommend to start with the basics how your language works and after that go to the design / architecture patterns. Than I would recommend Clean Code and The pragmatic programmer.
And than join the rest of us being clueless and opinionated at the same time because in our case our strategy worked ;D ....