At their simplest, classes and objects are a way to make programs more manageable by combining data with the operations allowed on that data. Object-oriented programming also allows programmers to separate interface from implementation, which in turn helps them create reusable components that can be substituted for one another. Finally, inheritance allows them to define common behaviors once, in one place, and override those definitions only when needed.