Every instance of a subclass is an instance of the superclass, but not vice-versa. As a result, inheritance allows substitutability : the ability to substitute a child class object where a parent class object is expected.
Academic is an instance of a
Staff, but a
Staff is not necessarily an instance of an
Academic. i.e. wherever an object of the superclass
is expected, it can be substituted by an object of any of its subclasses.
The following code is valid because an
AcademicStaff object is substitutable as a
Staff staff = new AcademicStaff (); // OK
But the following code is not valid because
staff is declared as a
Staff type and therefore its value may or may not be of type
AcademicStaff, which is the type expected by variable
Staff staff; ... AcademicStaff academicStaff = staff; // Not OK