Source: http://retis.sssup.it/~lipari/courses/oosd2010-1/06.java.pdf