接口的总结与面试题

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

  • 声明接口用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要允许接口定义私有方法呢?因为我们说接口是规范,规范是需要公开让大家遵守的。

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

 接口与抽象类之间的对比

相关推荐

  1. 面试总结-MQ总结

    2024-04-05 20:44:01       33 阅读
  2. MySQL面试总结

    2024-04-05 20:44:01       43 阅读
  3. vue面试总结

    2024-04-05 20:44:01       39 阅读
  4. 网络面试总结

    2024-04-05 20:44:01       33 阅读
  5. Shell面试总结

    2024-04-05 20:44:01       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 20:44:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 20:44:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 20:44:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 20:44:01       20 阅读

热门阅读

  1. C#的Thread.CurrentThread.IsBackground的作用

    2024-04-05 20:44:01       17 阅读
  2. 前端pdf.js将pdf转为图片,尤其适合电子发票打印

    2024-04-05 20:44:01       23 阅读
  3. Vue3:组件间通信-$refs和$parent的使用

    2024-04-05 20:44:01       16 阅读
  4. MySQL数据库——2、删除数据库

    2024-04-05 20:44:01       13 阅读
  5. Redis持久化方式之快照和只追加文件

    2024-04-05 20:44:01       15 阅读
  6. sql工作文档(待优化版本)

    2024-04-05 20:44:01       16 阅读
  7. VUE中组件常用的通信方式有哪些?

    2024-04-05 20:44:01       19 阅读
  8. Linux内存管理 —— 通过实验学习和理解CoW(1)

    2024-04-05 20:44:01       15 阅读
  9. 2023年第15届12月STEMA

    2024-04-05 20:44:01       16 阅读
  10. 趋势跟踪-笔记

    2024-04-05 20:44:01       15 阅读
  11. 三、c++代码中的安全风险-open

    2024-04-05 20:44:01       16 阅读
  12. Linux空洞文件

    2024-04-05 20:44:01       16 阅读
  13. Docker

    Docker

    2024-04-05 20:44:01      18 阅读