Source: http://www.dre.vanderbilt.edu/~schmidt/cs891f/2017-PDFs/L1-pt2-Java-data-and-control-abstraction-pt1.pdf