龙空技术网

013-接口和抽象类有什么区别

小崔爱读书 84

前言:

如今小伙伴们对“接口和抽象类在应用中有何区别”可能比较重视,同学们都想要分析一些“接口和抽象类在应用中有何区别”的相关知识。那么小编也在网络上收集了一些有关“接口和抽象类在应用中有何区别””的相关知识,希望咱们能喜欢,同学们一起来了解一下吧!

时间: 2021年2月26日星期五 元宵节 晴

题目

本期要说的是《2020年Java面试208题》的第13题,面试官提了这样一个问题:

接口和抽象类有什么区别?

技术点剖析

关于接口和抽象类的区别,这个问题网上有大量的文章进行说明,但大多数的文章描述的都有种盲人摸象的感觉,就是好像问你印度神话里的湿婆和梵天有什么区别?你憋了半天说,湿婆有四条胳膊,梵天有八条胳膊。要说吧,你说的没错,这是区别,但你跟我这样描述湿婆和梵天的区别,我还是没法理解湿婆和梵天都是干啥的。

我们来看看网上是如何描述接口和抽象类的区别的。

1 接口不能被继承,只能被实现;抽象类不能被实现,只能被继承;

2 接口不允许包含Main方法;抽象类可以包含main方法;

3 接口不允许有构造方法;抽象类可以有构造方法;

这些描述对于懂得人,一看都对,对于不懂的人 一看还是等于啥也没说。

做软件开发其实不是做理论研究的,更注重的是动手和实用性,我感觉应该从接口和抽象类的设计目的和功能性来描述,也就是程序员拿接口是干什么用的,拿抽象类是干什么用的。

接口定义的是“它能干什么”,定义的是“行为”;

抽象类定义的是“它是什么”,定义的是“身份”;

我们通过分析 StringBuffer和StringBuilder 这两个类,这两个类都是用来做字符串操作的,但区别是一个有线程安全,一个没有线程安全,那么这俩类区别就不大,分析源代码发现,两个类都是继承自AbstractStringBuilder ,这个抽象类已经基本明确了字符串操作者这个“身份”了,这就是抽象类的特性,基本把“自己是什么”这件事交代清楚了,只是有些细节还没定下来,需要子类具体的实现。

再分析StringBuffer和StringBuilder这两个类都实现了Serialiazable接口,这个接口定义了一个行为 -- 执行序列化,这个执行序列化是一个“行为”,通过实现Serialiazable接口就使StringBuilder和StringBuffer都拥有了序列化的“行为”。

以这样的源代码分析来理解面向对象的接口和抽象类的区别,我认为是容易理解的。

希望这种角度的解释对你理解接口和抽象类有帮助。

演示面试

技术点剖析完了,我来做一下演示面试:

你好,面试官,

1 我先从表现层描述一下接口和抽象类的区别

* 接口不可以包含main方法;抽象类可以包含main方法。

* 接口不可以包含成员变量;抽象类可以包含成员变量。

* 接口的所有方法都是抽象方法;抽象类允许包含普通方法,甚至允许一个抽象方法都没有。

* 接口是被实现的,关键字是implements;抽象类是被继承的,关键字是extends。

* 一个类可以实现多个接口;但一个类只能继承自一个抽象类。

2 更主要的我认为应该从设计目的和应用场景来区别

要想理解接口和抽象类的区别,必须从面向对象思想层面去分析。

面向对象思想有一个多态的思想,这个多态概念,这个我个人认为是面向对象最重要的特性,当然,一般程序员在写程序的时候其实自己写的更多是实现封装,甚至连继承都用的不多,尤其做企业应用平台的开发,更多的是对数据库的操作,只是对业务功能进行封装的时候用到一点封装思想。

说回到面向对象的多态,我认为有两种方式的多态要求,一是统一的行为定义,然后把行为附加到类上;二是统一的身份定义,不同的类在身份不变的前提下有细微的功能偏差。这两种多态要求决定了Java设计了接口和抽象类,接口主要是用来在类上附加一些统一的行为的;抽象类是明确身份和主要功能后,由子类做细节上的功能微调的。

这就是我理解的接口和抽象类的区别,我说完了。

=========================================================

以上就是我的演示面试,不知道是否让你满意。

自我点评

要想对接口和抽象类的理解深,我不太建议弄个猫呀、狗啊的做比喻,这种方式来比喻面向对象的特性,实在不太合适,我们写出来的程序和现实世界的动物是没有什么可比性。

我记得有句话:人无法想象没有见过的东西。我们要想真正理解面向对象的多态,就得多去看最优秀的面向对象多态的实现,也就是读Java源代码,Sun公司的那些世界级的大牛设计出来的代码之优美,远比网上任何一篇技术文章都摄人心魄。

这一期说到了印度的神,我不知道大家喜欢历史不,我之前读佛教的历史的时候琢磨过 印度史,还是挺有意思的,印度是个奇葩的国家,那片土地在古代孕育了古印度人,也发展出了发达的文明,我们用的阿拉伯数字就是古印度人发明的,我最佩服的就是古代印度人的记忆力,那么多的吠陀经居然不写下来,全靠人背诵,口口相传。佛经也是这样,也不写下来,全靠背。这是一种信仰,并不是人家没文字,古印度的文明很发达,很早就有了文字,人家就是不写就是靠背。行了,闲扯几句,有兴趣的我们有空也可以聊聊这些东西。

结束语

把现在这个节目的成绩给大家说一下,到现在我录制了 12期,每一期都很用心,在喜马拉雅总共订阅人数为 5人,平均每发出2.4期获得一次订阅;总播放次数为 410 人次,平均每期播放 31.17次;平均完播率为 55%,就是有一半都能听完一期节目,这个我还是比较满意的。

好了,就这样。我们下期再见。

标签: #接口和抽象类在应用中有何区别