接口与抽象类的区别------实际开发中的运用

接口和抽象类的区别每个开发在面试或笔试的时候都会被问到,不管大中小厂子,好像都必问一下。网上答案也很多,这里根据自己的总结用尽最简单的话语描述一下(不对的地方欢迎纠正):

抽象类(abstract)跟接口(interface)最大的一个区别就是:一个类只能继承一个父类,而一个类可以实现多个接口。
虽然二者都是面向对象中的部分抽象,但是接口一般是对动作行为的抽象,而抽象类是对实体根源本质上的一种抽象。是不是看到这些文字有点费脑筋去理解了?没事!
栗子走起:
现在有一个人的抽象类human和一个鱼的抽象类fish,假如你要新创建new一个人,只能extends人的抽象类human,然后实现所有人该有的方法:说话,走路,思考等等。没有创建人是extends 鱼的抽象类的,更加没有人又是人又是鱼(肯定有人杠精说美人鱼哈哈哈),所以继承就必须是单继承,父类决定类子类的本质是人还是鱼。抽象类里的方法可以有部分是public(公开的)的,或者private的(自己私有的),protect的(传家宝)。
而接口是对动作行为方法的抽象,所以当我们把游泳看作一个动作的抽象时候,就能implement实现它,也就是学会游泳。那我们还能学很多新技能动作,比如奔跑,跳跃,打球,所以能implement 游泳 ·奔跑·跳跃…所以接口能帮助实现‘多继承’。而接口里面的方法默认都是public开放的给大家学习实现的,师傅不能用private隐藏一些杀手锏不教学给徒弟(只要愿意去学去实现都能获得该技能)。
其次,接口和抽象类都是某种抽象,所以不能直接new,他们都不是实实在在的一个个对象,所以都必须有子类去继承他们的意志/实现传承他们的方法,才能new出一个个活生生的实例。还是那句话,抽象类决定它是什么,有哪些基础的行为;接口决定了它学到各种技能,能做什么。所以就是:一个类只能继承一个类却能实现多个接口。

class 林某 extends 人类(根源) implements 游泳,奔跑,爬树(技能)

那么,当你拜一个师傅学技能(也就是实现一个接口)的时候,肯定是要把这个师傅全部方法都学过来的,比如羽毛球不可能只学发球,不学高远球和劈吊杀,所以同样道理我们实现一个接口就必须实现它里面的全部方法,就算你学得不怎么样,感觉用不上(没有具体的业务),也要学一个动作装装样子知道有这么一回事(具体service逻辑空出来),不然的话拜师学艺肯定不能通过考核(编译报错,要求你实现全部接口的方法)。
但是,抽象类不同,抽象类是继承你父辈的,父辈很能喝酒,到你这辈可能滴酒不沾,所以你只需要继承需要用到的(比如吃饭/睡觉/喝水),因为你跟你父辈有点不同,所以你也必须是抽象(abstract)的。但是如果你跟你父辈一毛一样,那你就不抽象了,你完完全全是你父辈的翻版,实现了你父辈全部方法(抽烟吃饭睡觉喝酒)而且还实现出了自己的味道:你父辈只是抽烟,你抽中华,你父辈只是喝酒,你喝二锅头(这就是抽象方法的具体实现ing)。

为什么接口的属性必须是public static final的?

那就是比如你去学习打羽毛球(实现羽毛球接口),那拿到的工具(属性)肯定是羽毛球拍和羽毛球,public static final就是规定了学羽毛球只能用羽毛球拍,不是静态常量的话,你不就可以修改成用棒球棍去打羽毛球了?所以接口里的属性写出静态常量就是为了遵循个规范化,不让学这项动作技能的人乱来。

抽象类和它里面的方法不能用final修饰,为什么?

因为final修饰了,就绝后了,一个抽象类绝后了,还怎么生孩子让他来继承实现自己的方法?那他都没有了继承人,还有这么多遗产方法有什么鸡毛用?所以连这个抽象类都没必要存在了(编译就报错)

实际开发中如何选择接口还是抽象类??

实际开发中的运用,对一些业务功能的横向扩展时我个人习惯喜欢用抽象类实现多继承,可以用到多个类里面的方法(不必重复定义差不多的方法),但是实现类较多的时候,也会造成混乱(不知道这个方法是从哪个类过来的)。
对一些公用的service方法进行纵向深度扩展时,我就喜欢用继承,因为它不会有用到多个其他类里面方法,那我只需要再一层一层子类中定义它每一层业务公共Service独有的方法即可,到时候你愿意跟哪一层的子类或者父辈合作,就直接调用那一层的方法。

在这里插入图片描述

对于常用设计模式和实际运用代码和多态实现我会在今后的博客中铺上来大家一起讨论,共同进步,谢谢大家,鞠躬!

发布了13 篇原创文章 · 获赞 34 · 访问量 3729

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/103703328