Like to add one point in term of use of Abstract class and Interface:-
It's generally considered good OO practice to specify the "contract" which you want to adhere to via
Java interfaces.
Use abstract Java classes when you want to provide some standard base code but want/need to force the user's of your class to complete the implementation.