In this chapter, we created many abstract and concrete classes. We learned to control whether subclasses can or cannot override members, and whether classes can be subclassed.
We worked with instances of many subclasses and we understood that objects can take many forms. We worked with many instances and their methods in JShell to understand how the classes and the methods that we coded are executed. We used methods that performed operations with instances of different classes that had a common superclass.
Now that you have learned about members inheritance and polymorphism, we are ready to use contract programming with interfaces in Java 9, which is the topic we are going to discuss in the next chapter.