Program design in the context of object-oriented language (Java), with the focus on the design of class hierarchies to represent data and on designing methods for these hierarchies.