Basic OOP practice exercises for inheritance and polymorphism After teaching inheritance and implementation (implements vs extends in Java) and overriding methods and basic OOP (classes and interfaces), as well as polymorphism (up/downcasting) I want to give the students some exercises to practice this. 

Currently, I have the famous Animal -&gt; Mammal example, as well as Human -&gt; Teacher, Human -&gt; Student.

I am trying to think of new examples and exercises to practice the subjects mentioned. To give a better notion of what I'm looking for, the Animal exercise looks like this:

public abstract class Animal implements AnimalActions {
    private String name, family;
    private double weight;

    public Animal(String name, String family, double weight) {
        this.name = name;
        this.family = family;
        this.weight = weight;
    }
}

interface AnimalActions {
    public void eat();

    public void sleep();

    public void makeSound();
}


And then:

public class Mammal extends Animal {
    public Mammal(String name, String family, double weight) {
        super(name, family, weight);
    }

    @Override
    public void eat() {

    }

    @Override
    public void sleep() {

    }

    @Override
    public void makeSound() {

    }
}


This covers many things and is useful for teaching. However, this doesn't go very far if I make it into a practice exercise. What exercises do others give students in this subject? 

The students are in high school.
You could have a hierarchy based on an abstract class or interface Car, with implementations/subclasses for ElectricCar, HybridCar, GasBurningCar, etc. This illustrates that there can be very different implementations for an interface.

Each class would have different additional members. For example, a GasBurningCar could have a maximum amount of gas (in gallons or liters), represented as an int or double, or it could have a field of type GasTank. Having members gives students practice with has-a relationships, in addition to is-a relationships.

You could discuss trade-offs in whether an individual car model, such as Prius, should be an instance of HybridCar or a subclass.