differentiate abstract class vs interface in java