A class inherits instance variables and instance methods from all of its superclasses. Tree -> BinaryTree -> BST

You can specify only ONE superclass for any class.

When a subclass-superclass chain contains multiple instance methods with the same signature (name, arity, and argument types), the one closest to the target instance in the subclass-superclass chain is the one executed.

All others are shadowed/overridden.

Something like multiple inheritance can be done via interfaces (more on this later)

Overloading occurs when Java can distinguish two procedures with the same name by examining the number or types of their parameters.

Shadowing or overriding occurs when two procedures with the same signature (name, the same number of parameters, and the same parameter types) are defined in different classes, one of which is a superclass of the other.

Programs should obey the need-to-know principle , with public interfaces designed to restrict instance-variable and instance-method access, thus facilitating the improvement and maintenance of nonpublic program elements.

If you find yourself using the phrase an X is a Y when describing the relation between two classes, then the X class is a subclass of the Y class.

If you find yourself using X has a Y when describing the relation between two classes, then instances of the Y class appear as parts of instances of the X class.