Java面试题:接口和抽象类有什么区别(接口和抽象类知识点剖析和演示面试)

面试官提了这样一个问题:

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

技术点剖析

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

我们来看看接口和抽象类的区别的。

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

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

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

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

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

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

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

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

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

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

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

演示面试

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

你好,面试官,

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

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

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

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

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

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

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

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

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

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

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

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

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

自我点评

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

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

备注:在 JDK1.8的新特性中,接口增加了默认方法和静态方法,尽管设计的很奇怪,但是新版的JDK接口确实是允许实现方法。

给TA打赏
共{{data.count}}人
人已打赏
Java

Java面试题:Java的IO流有哪几种(IO流知识点剖析和演示面试)

2023-2-21 13:15:20

Java

Java基础知识:为什么ConcurrentHashMap 读操作不需要加锁?(ConcurrentHashMap简介)

2023-2-22 23:40:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
打开微信,扫描左侧二维码,关注【旅游人lvyouren】,发送【101】获取验证码,输入获取到的验证码即可解锁复制功能,解锁之后可复制网站任意一篇文章,验证码每月更新一次。
提交