Source: https://www.bluej.org/objects-first/chapters/objects-first-ch7.pdf