https://levelup.gitconnected.com/abstract-classes-and-interfaces-in-java-abstraction-and-flexibility-669c858b18af