A fundamental human way of dealing with complexity.
Managed with "classes" of "objects".
A focus on the outside view of an object; a simplification.
Use the "Principle of Least Astonishment".
Encapsulation
Implemented within objects to support abstraction.
Implemented with "classes" of "objects".
Also called "Information hiding".
Supports the separation of interface and implementation.
Modularity
Manages a second tier of complexity.
Modules represent a partitioning of software.
Prevents a "big bag of equally significant classes".
Modules are more loosely coupled than classes.
Hierarchy
An ordering of abstractions.
Class structure via inheritance ("is-a" relations)
Object structure via associations ("has-a" and "part-of" relations)
Typing
Language enforced to prevent erroneous conversions of objects.
Strong (C++) and weak (Smalltalk) typing can be implemented
in the language.
Static binding(Ada) and dynamic binding(C++,Java) possible.
Concurrency
Implemented with multiple processors or multitasking.
Addresses process abstraction (thread of control) and
synchronization at the object level.
Persistence
Addresses object lifespans.
Objects can be temporary in memory, stored in files,
or managed through O-O databases.
Varying levels of support from different languages.