In this chapter, you learned the difference between abstract and concrete classes. We learned how to take advantage of simple inheritance to specialize a base abstract class. We designed many classes from top to bottom using chained constructors, immutable fields, mutable fields, and instance methods.
Then we coded many of these classes in JShell, taking advantage of different features provided by Java 9. We overloaded constructors, overrode, and overloaded instance methods, and we took advantage of a special annotation to make overridden methods.
Now that you have learned about inheritance, abstraction, extension, and specialization, we are ready to finish coding the additional classes and understand how to work with typecasting and polymorphism, which are the topics we are going to discuss in the next chapter.