很多初学者在理解接口和抽象类的区别的时候总是会混淆不清两者之间的区别,本人当然也是,于是乎,看着网上的教程说接口好,于是,滥用接口就开始了,完全抛弃抽象类的存在
其实不用一味的去理解他们之间的区别,他们之间有什么区别? 非要深入知道么,只要回答一个类可以实现多个接口却只能继承一个抽象类就可以了,没任何意义,本人觉得问这个问题的人就存在问题,应该这么问:接口用在哪里,抽象类又用在哪里,这样就比较好理解了。
从这张图上我们可以总结关键性几点:
1.抽象类是一组具有同一类型的实体类的共有部分的提取。
2.接口不关心实现它的实体类是否是同一类型,一只鸟和一架飞机都可以实现飞的接口,虽然它们八不着边。
3.如果同一类型具有同一行为,那么应该考虑抽象类,如果不同类型具有同一行为,那么应该考虑接口。
4.设计一个接口不应该偏向某一类型,否则会造成实现这个接口的其他类型必须实现不必要的方法。
5.如果接口和抽象类存在冲突,应该首先考虑接口,也就是说把飞的方法放到接口里而不是抽象类里。
下面看一个小实例:设计一只海鸥和一架波音飞机。
由于这两个东西都能飞,首先我们设计一个接口。
- //能在天上飞的接口
- public interface IFly
- {
- void fly();
- }
设计到了两个类,鸟和飞机,我们也可以把他们抽象出来。
- //飞机的抽象类
- public abstract class Phone
- {
- //获取载客量
- abstract int getPassengerCount();
- }
- //鸟的抽象类
- public abstract class Bird
- {
- //获取性别 O__O
- abstract int getAge();
- }
然后把鸟生出来再把飞机造出来。
- //海鸥
- public class Seagull extends Bird implements IFly
- {
- public int getAge()
- {
- //公的母的你说了算 O(∩_∩)O哈哈~
- }
- public void fly()
- {
- //飞喽~~
- }
- }
- //波音
- public class Boeing extends Phone implements IFly
- {
- public int getPassengerCount()
- {
- //最少得能坐上七八个吧
- }
- public void fly()
- {
- //各位旅客,飞机已经起飞,请坐稳扶好
- }
- }
可以根据接口和抽象类写出更多鸟和飞机(造个骆驼就无能为力了)。最后自己总结:可以不用接口抽象类,但不要拿接口当抽象类,可以不OOP 但不要乱OOP
注:以上纯粹个人观点,如果大牛认为哪些不正确的话非常希望留下您的意见,谢谢了!