接口与抽象类的区别
区别一
抽象类只能单继承,接口能多实现
区别二
抽象类是一个类,可以被任意权限修饰符修饰,静态和非静态属性,final和非final属性,可以有非抽象方法;但接口中的方法不能实现(Java8中才开始有默认实现,Java9引入私有方法),默认public修饰。而且接口只能由static、final变量,而抽象类则不一定。
区别三
抽象的事物不同
- 抽象类是对整个类的抽象,包括属性(主要)和行为
- 接口是对类的行为(局部)进行抽象
区别四
定义的时候,定义抽象类和接口的思想不同
- 设计抽象类是自下而上的过程,我子类需要,所以我定义抽象类
- 设计接口是自上而下的过程,我接口规范某一行为,我某类需要这个行为,我实现某接口
区别五
设计层面不同
- 抽象类是模板式设计
- 接口是辐射式设计
核心:继承是 “是不是“(is-a)的关系,而接口实现则是 “有没有“(has-a)的关系。
打个比方:
- 抽象类
- 有个Person的抽象类,有个Student的类去继承Person。
- 这个学生是学生,也是人。
- 接口
- 我们可以写一个GoodAt接口,表明擅长的科目,里面写个goodAt()方法
- 再写几个不同的xxxGoodAt实现该接口
- 在Student类里写上成员GoodAt,在需要实现是new不同的
- GoodAt goodAt = new SamGoodAt();
- GoodAt goodAt = new AmyGoodAt();
- Sam有擅长数学的能力,Amy有擅长英语的能力
往深了说,我们还能讲到“设计模式”中的第一个最核心关键的**【策略模式】**
- 面向接口编程,而不是面向实现编程。
- 更多的选择组合,而不是继承
面向接口编程,有很好的可拓展性,可维护性,方便我们开发者去修改
- 对于那些确认不变的,我们写在父类里,去继承就好了
- 而那些具有可变因素的,接口应该是我们的首选,制定好一套行为规范,以不变应万变