接口和抽象类区别及使用选择总结
区别
- 构造函数:抽象类可以有构造函数,接口不可以
- main方法:抽象类可以有main方法并可以运行,接口不可以
- 访问修饰符:接口中的方法默认使用public abstract 修饰,抽象类中的方法可以使任意修饰符
- 实现数量:类可以实现很多个接口,但只能继承一个抽象类
- 成员变量:接口中的成员变量只能是public static final类型,抽象类中的成员变量可以使任意类型
设计目的及使用
- 接口的设计目的,是对类的行为进行约束,强制要求不同的类具有相同的行为,但并不对如何实现行为进行限制。
- 而抽象类的设计目的是代码复用。比如当不同的类中具有某些相同的行为和实现方式,就可以把这些抽象出来形成一个抽象类,让子类继承它,避免了让所有子类实现它,就达到了代码复用的目的。
- 抽象类是对类本质的抽象,表达的是一种“是什么”的关系,比如“学生是一个人”。抽象类包含并实现子类通用特性,而子类之间的差异化交给子类去实现。
- 而接口是对行为的抽象,表达的是“像什么”的关系。比如“鸟像飞机”,鸟飞行的行为像飞机,但鸟的本质还是鸟。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。
使用场景
- 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
- 抽象类的功能远超接口,但是代价很高,所以在程序设计中通常更多的定义接口。