• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

接口与抽象类

技术杂谈 勤劳的小蚂蚁 3个月前 (01-29) 68次浏览 已收录 0个评论 扫描二维码

在Java中,四大基本特性的「抽象性」是通过两种方式来体现的,包括接口和抽象类。两者看似相同,实则有很多不同之处,面试中也经常会被问到 「谈谈对接口与抽象类的理解?接口与抽象类有什么区别?两者分别在什么场景中使用?」 等问题,在此做一个系统的梳理与总结,建议重点关注。

谈谈对接口与抽象类的理解?

接口是对行为的抽象,其可以含有属性和方法。
  • 属性被隐式指定为public static final的,即全局常量。
  • 方法被隐式执行为public abstract的,即抽象方法。
也就是说,接口中的所有方法都必须为抽象方法,不能有具体实现。所以说,接口是对行为的抽象。
抽象类是对类(一类事物)的抽象,《Java编程思想》一书中将抽象类定义为包含抽象方法的类,但准确来说,包含抽象方法的类一定是抽象类,但抽象类不一定有抽象方法,只要用abstract修饰即可为抽象类,但个人认为没有抽象方法的抽象类并没有实际意义吧?
抽象类可以含有属性、方法和构造器。
  • 方法可以是普通方法也可以是抽象方法,若为抽象方法则必须为public或protected的,缺省情况下默认为public的,因为抽象方法需要被子类继承和实现。
  • 构造器虽然有,但因为抽象类含有无具体实现的方法,所以抽象类不能进行实例化。
接口与抽象类的区别 见下一题。

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

语法层面上的区别:
  • 成员变量:抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是常量,即public static final修饰的。
  • 成员方法:抽象类中的成员方法可以是抽象的也可以是普通的(有具体实现的),而接口中的成员方法只能是public static修饰的。
  • 静态结构:抽象类中可以有静态代码块和静态方法,而接口中不能有静态代码块和静态方法。
  • 构造方法:抽象类中可以有构造器,而接口中没有,但两者都不能进行实例化,但可以定义抽象类和接口类型的引用。
  • 继承与实现:一个类只能继承一个抽象类,而一个类却可以实现多个接口。
设计层面上的区别:
  • 抽象类是对类(一类事物)的抽象,而接口是对行为的抽象。再具体一点说,抽象类是对一类事物整体(包括属性和行为)进行抽象,而接口是对类的局部(仅对行为)进行抽象。如飞机、鸟和飞行而言,应分别将其设计为类、类和接口。
  • 抽象类作为很多子类的父类,是一种模板式设计,而接口作为一种行为规范,是一种辐射式设计。如果需要添加新的方法,抽象类作为模板,可以直接添加带具体实现的方法而无需改变子类,而接口作为规范,规范改变(添加行为),遵守规范的子类都必须进行相应的改动。

接口与抽象类分别在什么场景中使用?

问题同「你在项目中哪些地方使用过接口和抽象类?具体是怎么使用的?」
建议阅读「门与警报」的例子。
门都有打开和关闭两个行为,此时若需要门具备警报行为,应该如何实现呢?
其实,门的打开和关闭属于门本身固有的行为,而警报功能属于门非固有的行为(附加行为)。最佳解决方案是,将门设计为一个抽象类,包括打开和关闭两种行为,而将警报设计为一个接口,包括警报行为,进而设计一个警报门继承抽象类并实现警报接口即可。

扩展面试题

问:接口与抽象类哪个更为抽象?
答:接口,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法,故接口比抽象类更为抽象。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:接口与抽象类
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00