Source: https://www.cs.colostate.edu/~france/CS314/Lectures/2011-Lectures/OOPReview2011.pdf