接口的总结与面试题

  • 接口本身不能创建对象,只能创建接口的实现类对象,接口类型的变量可以与实现类对象构成多态引用。

  • 声明接口用interface,接口的成员声明有限制:

    • (1)公共的静态常量

    • (2)公共的抽象方法

    • (3)公共的默认方法(JDK8.0 及以上)

    • (4)公共的静态方法(JDK8.0 及以上)

    • (5)私有方法(JDK9.0 及以上)

  • 类可以实现接口,关键字是implements,而且支持多实现。如果实现类不是抽象类,就必须实现接口中所有的抽象方法。如果实现类既要继承父类又要实现父接口,那么继承(extends)在前,实现(implements)在后。

  • 接口可以继承接口,关键字是extends,而且支持多继承。

  • 接口的默认方法可以选择重写或不重写。如果有冲突问题,另行处理。子类重写父接口的默认方法,要去掉default,子接口重写父接口的默认方法,不要去掉default。

  • 接口的静态方法不能被继承,也不能被重写。接口的静态方法只能通过"接口名.静态方法名"进行调用。

面试题

1、为什么接口中只能声明公共的静态的常量?

因为接口是标准规范,那么在规范中需要声明一些底线边界值,当实现者在实现这些规范时,不能去随意修改和触碰这些底线,否则就有"危险"。

例如:USB1.0规范中规定最大传输速率是1.5Mbps,最大输出电流是5V/500mA

USB3.0规范中规定最大传输速率是5Gbps(500MB/s),最大输出电流是5V/900mA

例如:尚硅谷学生行为规范中规定学员,早上8:25之前进班,晚上21:30之后离开等等。

2、为什么JDK8.0 之后允许接口定义静态方法和默认方法呢?因为它违反了接口作为一个抽象标准定义的概念。

静态方法:因为之前的标准类库设计中,有很多Collection/Colletions或者Path/Paths这样成对的接口和类,后面的类中都是静态方法,而这些静态方法都是为前面的接口服务的,那么这样设计一对API,不如把静态方法直接定义到接口中使用和维护更方便。

默认方法:(1)我们要在已有的老版接口中提供新方法时,如果添加抽象方法,就会涉及到原来使用这些接口的类就会有问题,那么为了保持与旧版本代码的兼容性,只能允许在接口中定义默认方法实现。比如:Java8中对Collection、List、Comparator等接口提供了丰富的默认方法。(2)当我们接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。

3、为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范是需要公开让大家遵守的。

私有方法:因为有了默认方法和静态方法这样具有具体实现的方法,那么就可能出现多个方法由共同的代码可以抽取,而这些共同的代码抽取出来的方法又只希望在接口内部使用,所以就增加了私有方法。

接口与抽象类之间的对比

相关推荐
T___T2 小时前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人2 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
程序员杰哥2 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
勤劳打代码2 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
努力学算法的蒟蒻2 小时前
day10(11.7)——leetcode面试经典150
面试
进击的野人3 小时前
JavaScript 中的数组映射方法与面向对象特性深度解析
javascript·面试
南山安3 小时前
以腾讯面试题深度剖析JavaScript:从数组map方法到面向对象本质
javascript·面试
橘颂TA5 小时前
【剑斩OFFER】算法的暴力美学——二分查找
算法·leetcode·面试·职场和发展·c/c++
吃着火锅x唱着歌13 小时前
LeetCode 1128.等价多米诺骨牌对的数量
算法·leetcode·职场和发展
java1234_小锋16 小时前
Spring事件监听的核心机制是什么?
java·spring·面试