接口和抽象类的前世今生

今天被人问了java的接口了抽象类的不同处,我回答的就是网上的常规答案是:

1、内容层面而言抽象类更丰富点:

抽象类可以有实体方法、可以有各种类型变量成员、可以有全部的访问级别;除了必须有抽象方法外,和常规类没有其它差别

这方面来讲,接口是对抽象类的精简版;除了抽象方法保留了,其它特性都去掉了;没有实体方法、访问级别只能是public、成员变量只能是public static final

2、使用机制上也有所不同:

抽象类可以继承接口、抽象类、实体类;而接口只能继承接口

接口被抽象类继承是无需实现所有方法;而被实体类继承后接口和抽象类都需要全部实现

接口可以多重继承,抽象类不可以


总的来说:

上面都是针对接口和抽象类的规范约定,都是比较生硬的东西;对于我这样的记性来说,没有逻辑的东西和背政治一样样的很难记住;通常想起多少是多少?最关键知道了又有啥用,不记得个别约定IDE也会提醒的,而且一生能遇到几次被IDE这样提醒?呵呵,所以通常都不会去刻意记,我认为脑子本身就有限,平常得装些有用的重要的优先级到的东西。

针对上面总结的简单不费劲的公式:普通实体类 + 抽象方法 --> 抽象类 - 实体方法 - 访问级别 -->  接口


但是话说回来了,即使我有脑子把上面的都一字不差的记住了也没有用?因为还是有很多人都有这样的问题:什么时候选择使用接口、什么时候选择使用抽象类?貌似接口的功能抽象类都支持,除了多重继承以外;那么问题就来了,其实他两就是差在这个方面,其他方面的差异性都是因为这个起因然后再定义的,具体请看下文分解。


分析

当我们认识一个新的事物的时候,往往我们理解的都是它的第一印象或者第一层面,即当前的状态;而当我想更深入的理解某个事物的时候,这样的理解往往就不够了,比如上面对接口和抽象类的理解。


方法论

那么,如何去更好的认识一个新事物呢?这就延伸到一个方法论的问题了,也就是我们学习和认识新东西时,所使用的可以有章可循的具体方法;这个方法每个人都有,只是考虑的层次、切入的层面不一样而已;方法论是我们每个人根据自己的经验所提炼出来的,那么今天也突然总结出了学习新事物的方法了;即了解一个事物总是要了解它来自哪?现在啥样?要去到哪?人生的终结哲学问题有么有?呵呵


来自哪

主要是弄明白这个事物的缘由或者原理;即为什么要做这个东西,目的是什么,没有人会啥到做一个没有用的东西,并且还有这么多人在用,对吧?对于那些缘由你已经很明白的东西,比如:jsp技术;那你要考虑的就是研究它的原理和实现机制;所以如果要是理解了一个事物的来源和根据,就能很容易的理解这个很事物,让你对它的认识和运用更上一层楼。


现在啥样

就是当前的状态,你能着着实实的看得到的东西,就是上面那些直白的内容


要去哪

即实际的环境中,会在哪些方面、哪些场景中应用;了解一个东西来自哪和啥状态,有时候你还是不能很好的明白它的作用与意义;对于有些事物的理解往往只能意会,不可言传时,举个栗子、打个比方、讲个故事,总是能让人豁然开朗,就是这个原因。


言归正传,那么接口和抽象类到底啥区别呢?


首选,抽象类是实体类的一种特殊形式,主要就是节约点时间,共用点重复代码,无它;所以在本质特性上它和实体类没区别,主要是针对实体对象来设计的,也就是说它对应的是一个具体对象;比如:鸟你可以设计成一个实体类,当然也可以设计成抽象类,但别设计成接口类。


接口是只是把抽象类的抽象方法保留了,所以它一出生不是用来替代类【不管抽象还是实体】的,也不是共用代码的,而是用来补充类的;那么补充的是哪方面呢?这个自然不是补充实体所对应的对象【因为一个实体只要一个对象就可以了,不能有两个对象,那样就乱了;这也是为什么类不能多重继承的原因】,而是对实体对象的特定方法、属性进行补充,因为不同实体对象可能有包含好多特定方法,而这些方法有可以组合和重用,所以这就是接口可以被多重继承的原因【即不与单一实体设计违背,又能重用接口设计】。


那么问题就来了,有些人会认为,接口这样设计确实可以作为功能补充,but它定义的都是抽象函数,没有任何实体内容,这样的功能补充有意义么?其实我当初也是这样么认为的,觉得没有接口其实也可以很happy的编码呢!其实接口更多的意义是补充一种扩展功能的接入规范,它定义了具体返回类型、方法名、参数等等数据;其实就是约定了如果你实现某个接口,就认为你肯定是想做这个特定的事情,因为是你主动要去实现的,而不是无意识的刚好编写了一个一模一样的方法,而被调用者误解;


另一方面调用者直接通过检查其实现的接口名称就能判断这个实体基类可以提供哪些功能,而且是提供者有意识为之的;而不用逐个检查方法名、参数名等等一系列内容来保证被调用者有所需方法;也不用担心碰到一个一模一样的方法,但却是被调用者无意识的实现的,即在功能的目的性上其实是有很大差异的。


所以接口就被设计成即插即用的扩展接口,用来对实体对象的功能进行扩展、补充和接入规范;比如:啄木的功能你就可以设计成接口,而不应该设计成抽象类,同样你还可以设计具体捕鱼功能的接口。


最后,你要是还不明白。放弃java吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上帝De助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值