Deriving from an existing class
Inheritance relates a derived class to a base class. A derived class can use inherited members and add its own, allowing shared behavior to be maintained together. Visibility and object construction follow language rules. Whether a hierarchy usefully represents a problem depends on the behavior of its objects as well as their names.
References: [1]
Overriding and dynamic dispatch
A derived class may override an inherited method. Dynamic dispatch can select an implementation using the actual object type, allowing a common operation to produce type-specific behavior. Fields, static methods, and instance methods need not obey identical selection rules; matching names alone do not establish that every access is dynamically dispatched.
References: [2]
Coordinating initialization
Construction must initialize both base-class state and additions made by the derived class. Java constructors are not inherited as ordinary members, although a subclass constructor can invoke a superclass constructor. Python provides super for cooperative calls along its inheritance order. Initialization order and argument conventions must agree to produce a consistent object.
References: [1]
Multiple inheritance and composition
Python permits multiple base classes and defines a method resolution order; Java classes have one direct superclass, with separate interface rules. Shared ancestors require careful coordination. Composition offers another design: an object stores collaborators and delegates work to them. This expresses a use relationship without making every form of reuse part of a class hierarchy.
References: [2]