千家信息网

Java8的默认方法是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。什么是默认方法
千家信息网最后更新 2026年10月31日Java8的默认方法是什么

这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。

    什么是默认方法

    默认方法是接口中用default修饰的方法,其中包含方法内容

    比如下面这个:

    public interface InterfaceDemo {   // 普通方法,只定义,不实现   void oldFun();   // 默认方法,又定义,又实现   default void newFun(){       System.out.println("newFun");  }}

    为啥要提供默认方法呢?

    为了向后兼容(这也是导致Java变得臃肿的原因之一)。

    因为升级系统时,难免会有一些新功能需要加入,此时如果接口类新增了方法,那么实现类就必须同步修改实现;

    这样工作量还是很大的,而且很容易出错。

    所以Java8开始,推出了接口的默认方法这个功能,使得接口升级变得更加平滑

    比如下面的代码:InterfaceDemo就是上面那个接口

    public class UserDemo implements InterfaceDemo{   @Override   public void oldFun() {       System.out.println("oldFun");  }   public static void main(String[] args) {       UserDemo demo = new UserDemo();       /**        * InterfaceDemo升级后,新增了newFun方法        * 但是由于newFun是默认方法,有提供实现内容        * 所以这里的子类 UserDemo就可以直接使用         */       demo.newFun();  }}

    我们可以看到,UserDemo没有实现新的方法newFun(),但是也可以编译运行,并直接调用newFun()

    这就是默认方法的好处:对实现类来说是无痛升级的

    如果不提供呢?

    不提供的话,接口类升级时,系统有两个选择

    • 实现类升级:

      • 实现类老老实实地按照接口升级后的方法,进行同步修改实现,但是工作量大

    • 实现类不升级:

      • 实现类不升级也是可以的,只要不引入接口类的新版本就可以了,那么这个时候系统还是可以运行的,这没啥问题。但是谁能保证一辈子都不更新系统呢?如果更新系统时,接口类库升级到新版本,那么编译还是通不过

    主要针对谁?

    接口的默认方法主要是针对类库设计者

    实现了默认方法的接口和抽象类有区别吗

    区别没有之前那么多,但还是有的:

    • 抽象类单继承,接口类多实现

    • 抽象类中的属性定义时不需要初始化,接口类的属性定义时要初始化(默认修饰符为public static final)

    是不是可以说Java现在也实现了多重继承?

    可以这么说。

    但是现在面临的一个新问题,就是多重继承带来的二义性问题,有点类似之前介绍的致命方块(也叫菱形问题)

    如下面的UML图所示

    比如上面这种,你无法知道A会调用哪个接口的fun方法

    所以编译器会报错:

    com.jalon.java8.defaultmethod.A inherits unrelated defaults for fun() from types com.jalon.java8.defaultmethod.B and com.jalon.java8.defaultmethod.C

    解决办法:

    • 先覆写fun方法

    • 再显示声明调用哪个接口的fun方法

    代码如下:

    public class A implements B,C{   @Override   public void fun(){       // 显示调用B的默认方法       B.super.fun();  }   public static void main(String[] args) {       A a = new A();       // 这里会打印B的fun       a.fun();  }}interface D{   default void fun(){       System.out.println("D");  }}interface B extends D{   @Override   default void fun(){       System.out.println("B");  }}interface C extends D{   @Override   default void fun(){       System.out.println("C");  }}

    关于"Java8的默认方法是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Java8的默认方法是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

    方法 接口 升级 系统 内容 还是 问题 就是 知识 编译 代码 属性 工作量 篇文章 面的 同步 工作 更新 运行 很大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 互联网科技工作委员会 互联网科技会 互联网科技未来 互联网科技上市公司 互联网科技宣传片 成都仁贤领冠互联网科技有限公司 安控科技rtu产品工业互联网 温州喔噻互联网科技有限公司 和信科技工业互联网 链环科技传统企业怎么转型互联网 天津腾达互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 深圳市罗太互联网科技有限公司 晋城互联网科技 宁波跨境商互联网科技有限公司 上海同邻互联网科技有限公司规模 科技互联网专业工作会议发言稿 互联网科技大会大佬 山东亿川互联网科技有限责任公司 科技和互联网公司 工业互联网科技新基建 互联网科技论文 壹账通互联网科技 猫创互联网科技 港股科技和互联网 玉溪新华互联网科技好不好 恒生互联网科技业指数调整周期 电子商务与互联网科技的关系 北京天晋互联网科技有限公司
    0