Source: http://lacl.univ-paris12.fr/cegielski/Java/ch5.pdf