Source: https://www.csd.uoc.gr/~hy252/Lectures07/pdf/CS252InnerClasses07.pdf