Basic building blocks of OOP - defining classes, creating objects, constructors
Enumeration types for defining fixed sets of constants
Contracts that define behavior without implementation
Bundling data with methods, hiding internal state
Hiding complex implementation details, exposing only necessary features
Creating new classes from existing ones, code reuse through hierarchy
Same interface, different implementations - method overloading/overriding
When to use abstract classes vs interfaces - contracts, partial implementation, multiple inheritance trade-offs
Overloading is compile-time polymorphism; overriding is runtime. Learn the rules, key differences, and common interview pitfalls for Java, Python, and C++ with examples.