Source: https://inst.eecs.berkeley.edu/~cs61a/su16/assets/slides/16-Object-Oriented_Programming_II_1pp.pdf