In this chapter, you learned the differences between mutable and immutable classes and the mutating and non-mutating instances that they generate. We declared mutable and immutable versions of a 3D vector class in Java 9.
Then, we took advantage of JShell to easily work with the mutating and non-mutating instances of these classes and we analyzed the difference between changing the state of an object and returning a new object whenever we have to change its state. We analyzed the advantages and disadvantages of mutable and immutable classes and we understood why the latter are useful when working with concurrent code.
Now that you have learned about mutable and immutable classes, you are ready to work with inheritance, abstraction, extension, and specialization, which are the topics we are going to discuss in the next chapter.