Java 1.8 default 接口默认方法

更新时间 2023-07-25 17:37:21

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1800+ 小伙伴加入学习 ,欢迎点击围观

一、默认方法是什么?

在 Java 8 之前,接口不能包含实现方法,只能声明抽象方法。然而,Java 8 引入了一个新特性,允许我们在接口中添加非抽象方法,也就是默认方法。这些默认方法带有 default 关键字。

默认方法的引入,主要是为了解决接口的修改与现有的实现不兼容的问题。当接口添加新方法时,如果不是默认方法,所有实现了该接口的类都需要修改,以实现新添加的方法。这样的设计对于已经大规模使用的接口来说显然不是一个好选择。

public interface Vehicle {
    default void print(){
        System.out.println("我是一辆车!");
    }
}

上面这个例子中,我们声明了一个名为 Vehicle 的接口,并定义了一个默认方法 print

二、如何使用默认方法?

实现了带有默认方法的接口的类,可以选择覆盖默认方法,也可以直接使用默认方法。这非常灵活。

public class Car implements Vehicle {

}

public class Bus implements Vehicle {
    @Override
    public void print() {
        System.out.println("我是一辆公交车!");
    }
}

在这个例子中,Car 类没有覆盖默认方法,当我们调用 print 方法时,将会执行 Vehicle 接口中的默认实现;而 Bus 类覆盖了默认方法,当我们调用 print 方法时,将会执行 Bus 类中的实现。

三、默认方法和多重继承

Java 不支持类的多重继承,但接口允许多重继承。如果一个类实现了多个接口,这些接口中有相同的默认方法,那么会出现什么情况呢?

public interface Vehicle {
    default void print(){
        System.out.println("我是一辆车!");
    }
}

public interface FourWheeler {
    default void print(){
        System.out.println("我是一辆四轮车!");
    }
}

public class Car implements Vehicle, FourWheeler {

}

在这个例子中,Car 类实现了 VehicleFourWheeler 两个接口,这两个接口都有一个名为 print 的默认方法。在这种情况下,Java 编译器会报错,因为它不知道应该选择哪一个默认方法。解决这个问题的方法是 Car 类需要覆盖 print 方法:

public class Car implements Vehicle, FourWheeler {
    public void print(){
        Vehicle.super.print();
    }
}

Car 类中,我们使用了 Vehicle.super.print(); 来调用 Vehicle 接口中的 print 方法。这样,就解决了默认方法的冲突问题。