这道面试看起来很简单,但是回答起来还真不定能答到点上,特别是中高级程序员。一般回答是下面这样的回答:
相同点:
- 它们都可以定义抽象方法,供子类实现;
不同点:
- 抽象类是用来继承的,并且一个类只能继承一个抽象类;接口是用来实现,并且一个类可以实现多个接口;
- 抽象类可以有普通的成员函数,接口中只能存在public abstract 方法(默认的就是,1.8以前的版本);
- 抽象类可以有成员变量并且可以是各种类型;接口的成员变量只能是 public static final 类型的;
像上面的回答符合初级程序员标准,想要加分,或者体现出你的中高级水平,再加上下面几点回答,会让面试官对你更高看一眼。
- 接口设计的目的,是对类的行为进行约束,凡事实现它的都必须要有这个行为,这是强制性的。只不过这个行为产生的过程是不一样的。例如,猫和狗都会叫,但是猫的叫声是“喵喵喵”,狗的叫声是“汪汪汪”。
- 抽象类设计的目的,更多的是代码复用,举个简单例子,如下图,可以看到A和C重叠的部分是B,那么B就可以放在抽象类中实现,供所有子类调用,这就实现了代码复用。至于非重叠部分就由A和C自己实现。
- 使用场景:当你关注一个事物的本质时,就用抽象类;当你只关注事物的行为时,那就用接口;
- 从功能上说,抽象类的功能远大于接口,但是定义抽象类是有代价的,首先每个类只能继承一个类,其次抽象类必须实现所有子类的共性。而接口相对就弱化了很多,它只是定义了一个行为,至于这个行为如何发生是不管的,并且一个类可以实现多个接口。