## Notes
- Abstraction
- Encapsulating Data
- Inheritance
- Polymorphism
## Abstraction
- Define core properties/behaviors and remove the rest
- In the example of a car, people don't have to worry about the internal combustion engine; they only need to know how to operate the steering wheel, the pedals, mirrors, seatbelts, etc
- Keep the method signature the same and you can change the internal details, like API callers not needing to know underlying database details
## Encapsulating Data
- Define access controls to data
- Some variables can be private/internal whereas others can be publicly accessible
- Information hiding
- Fosters modular design
## Inheritance
- Favors/provides for code reusability by using base classes, parent classes, subclasses
## Polymorphism
- Objects can be composed of many forms
- Makes code more flexible
- Compile-time polymorphism
- Method overloading: describes which implementation to use based on provided inputs
- Runtime polymorphism
- Method overriding: defines which implementation to use based on inheritance
## References
- [[Study for EPAM Backend Interview]]
- [Principles of OOP - Interview Bit](https://www.interviewbit.com/blog/principles-of-oops/)
- [Principles of OOP - The Knowledge Academy](https://www.theknowledgeacademy.com/blog/principles-of-object-oriented-programming/)