Inheritance¶
One of the really useful features of Object-Oriented programming is inheritance. You may have heard of someone coming into an inheritance, which often means they were left something from a relative who died. Or, you might hear someone say that they have inherited musical ability from a parent. In Java all classes can inherit attributes (instance variables) and behaviors (methods) from another class. The class being inherited from is called the parent class or superclass. The class that is inheriting is called the child class or subclass.
When one class inherits from another, we can say that it is the same kind of thing as the parent class (the class it inherits from). For example, a car is a kind of vehicle. This is sometimes called the is-a relationship, but more accurately it’s a is-a kind of relationship. A motorcycle is another kind of vehicle. All vehicles have a make, model, and year that they were created. All vehicles can go forward, backward, turn left and turn right.
A UML (Unified Modeling Language) class diagram shows classes and the relationships between the classes as seen in Figure 1. An open triangle points to the parent class. The parent class for Car
and Motorcycle
is Vehicle
. The Vehicle
class has two child classes or subclasses: Car
and Motorcycle
.
Subclass extends Superclass¶
To make a subclass inherit from a superclass, use the Java keyword extends with the superclass name when creating a new subclass as shown below.
public class Car extends Vehicle
public class Motorcycle extends Vehicle
Note
While a person can have two parents, a Java class can only inherit from one parent class. If you leave off the extends keyword when you declare a class then the class will inherit from the Object
class that is already defined in Java.
Why Use Inheritance?¶
Inheritance allows you to reuse data and behavior from the parent class. If you notice that several classes share the same data and/or behavior, you can pull that out into a parent class. This is called generalization. For example, Customers and Employees are both people so it makes sense use the general Person class as seen below.
Inheritance is also useful for specialization which is when you want most of the behavior of a parent class, but want to do at least one thing differently and/or add more data. The example below can also be seen as specialization. An employee is a person but also has a unique id. A customer is a person, but also has a credit card.
- It doesn't have a parent class.
- If no parent class is specified using the extends keyword, the current class will still have a parent class.
- It inherits from the Object class.
- If no parent class is specified using the extends keyword, the parent class will be Object.
- It inherits from the Default class.
- There isn't a class named Default.
- It inherits from the Parent class.
- There isn't a class named Parent.
10-1-1: If you don’t specify the parent class in a class declaration which of the following is true?
- Yes
- Yes, a child class inherits all the parent class object field and methods.
- No
- Why would inheritance be useful if you didn't actually get anything from the parent class?
10-1-2: If the class Vehicle has the instance fields make and model and the class Car inherits from the class Vehicle, will a car object have a make and model?
- Yes
- Is a parking garage a kind of vehicle?
- No
- No, a parking garage is not a kind of vehicle. Instead it has vehicles in it which implies that the ParkingGarage class would have a field that tracks the vehicles in it.
10-1-3: If I had a class ParkingGarage should it inherit from the class Vehicle?
- 0
- In Java a class always has at least one parent class. If none is specified the default is Object.
- 1
- All classes in Java have one and only one parent class.
- 2
- While that is how it works with humans, is that how Java works?
- infinite
- This is true for interfaces, but not parent classes.
10-1-4: In Java how many parents can a class have?
is-a vs. has-a¶
Another type of relationship between classes is the has-a relationship or association relationship. Use this when the object of one class contains a reference to one or more of another class. For example, a course can have many course periods associated with it as shown below. The 1
near the Course
means that 1
course object is associated with the number shown near the other class. In this case it is *
which means 0 to many. So one course is associated with 0 to many course periods.
In the code, the Course
class has an array or ArrayList of CoursePeriod
objects as an attribute inside it.
public class Course {
private ArrayList<CoursePeriod> periodList;
}
Alternatively, we could say that a CoursePeriod has a Course attribute inside it to hold the information about the Course. It is up to the programmer how to design these two classes depending on which type of association would be more useful in the program.
public class CoursePeriod {
private Course courseInfo;
private int period;
}
Here is another example. Consider the class Student and Course and an APcourse. An APcourse is a special type of Course. Students are in Courses. What are the relationships between these classes? The UML diagram below shows the inherits (is-a) relationship between Course and APcourse and the associate (has-a) relationship between Class and Students.
is-a Substitution Test¶
If you aren’t sure if a class should inherit from another class ask yourself if you can substitute the subclass type for the superclass type. For example, if you have a Book
class and it has a subclass of ComicBook
does that make sense? Is a comic book a kind of book? Yes, a comic book is a kind of book so inheritance makes sense. If it doesn’t make sense use association or the has-a relationship instead.
Note
Only use inheritance when the child class is really a type of the parent class, otherwise use association.
- Create one class PublishedMaterial with the requested attributes.
- This will complicate the process of retrieving objects based on their type. Also if we need to add information that is specific to Book or Movie, it would be best if these were subclasses of PublishedMaterial.
- Create classes Book and Movie and each class has the requested attributes.
- This involves writing more code than is necessary (usually people copy and paste the shared code) and makes it harder to fix errors. It would be better to put common attributes and methods in the superclass PublishedMaterial and have Book and Movie be subclasses.
- Create the class PublishedMaterial and have Book and Movie inherit from it all the listed attributes.
- We will need to get objects based on their type so we should create classes for Book and Movie. They have common attributes so we should put these in a common superclass PublishedMaterial.
- Create one class BookStore with the requested attributes.
- The class name, BookStore, seems to imply the thing that keeps track of the store. This would be an appropriate class name for an object that handles the items in the Bookstore. However, for the published material, it would be better to use a superclass PublishedMaterial and subclasses for Books and Movies.
- Create classes for PublishedMaterial, Books, Movies, Title, Price, ID, Authors, DatePublished
- This is more classes than is necessary. Items such as Title, Price, ID, and DatePublished are simple variables that do not need a class of their own but should be attributes in a PublishedMaterial superclass, with Movies and Books as subclasses.
10-1-5: An online store is working on an online ordering system for Books and Movies. For each type of Published Material (books and movies) they need to track the id, title, date published, and price. Which of the following would be the best design?
- An is-a relationship. The Author class should be a subclass of the Book class.
- Is an Author a type of Book? Or, does a Book have an Author associated with it?
- An is-a relationship. The Book class should be a subclass of the Author class.
- Is a Book a type of Author? Or, does a Book have an Author associated with it?
- A has-a relationship. The Book class has an Author attribute.
- A Book has an Author associated with it. Note that you could also say that an Author has many Books associated with it.
10-1-6: An online site shows information about Books and Authors. What kind of relationship do these two classes have?
- superclass
- The parent class is the superclass, but this is not the Java keyword for declaring the parent class.
- parent
- The class you are inheriting from is called the parent or superclass, but this is not the Java keyword.
- extends
- The extends keyword is used to specify the parent class.
- class
- The class keyword is used to declare a class, but not the parent class.
10-1-7: What Java keyword is used to set up an inheritance relationship between a subclass and a superclass?
Summary¶
A class hierarchy can be developed by putting common attributes and behaviors of related classes into a single class called a superclass.
Classes that extend a superclass, called subclasses, can draw upon the existing attributes and behaviors of the superclass without repeating these in the code.
The keyword extends is used to establish an inheritance relationship between a subclass and a superclass. A class can extend only one superclass.
Extending a subclass from a superclass creates an is-a relationship from the subclass to the superclass.