Java8带来了一些全新的特性,包括lambda表达式、函数接口、方法引用、流、可选方法、接口中的静态方法和默认方法。

在本文中,我们将深入讨论为什么java8接口新增了默认方法,如何使用默认方法,并讨论一些有用的用例。

在接口中用default关键字定义接口的默认方法。普通接口方法是不能有实现的,默认方法必须有实现:

public interface MyInterface {
    // 普通接口方法
    default void defaultMethod() {
        // 默认方法

为什么需要默认方法

在Java8之前,接口只能有抽象方法。如果不强制所有实现类创建新方法的实现,就不能向现有接口添加新功能。

Java8新增默认方法的原因非常明显。

在一个典型的基于抽象的设计中,一个接口有一个或多个实现类。接口要新增方法,所有的实现都要新增这个方法的实现。否则就不满足接口的约束。

默认接口方法是处理此问题的解决方案。在接口添加默认方法不需要修改实现类,接口新增的默认方法在实现类中直接可用。

默认方法的使用

定义MobilePhone接口,其中setTime,getLengthInCm为默认方法

interface MobilePhone {
     * 获取手机品牌
    String getBrand();
     * 获取手机颜色
    String getColor();
     * 获取手机长度(毫米)
    Double getLength();
     * 设置手机时间
    default String setTime(String newTime) {
        return "time set to " + newTime;
     * 对getLength方法进行拓展,返回厘米为单位的长度
    default String getLengthInCm() {
        return getLength() / 10 + "cm";

默认方法在实现类中可以直接使用:

public class DefaultTests implements MobilePhone {
    @Override
    public String getBrand() {
        return "iphone";
    @Override
    public String getColor() {
        return "red";
    @Override
    public Double getLength() {
        return 150.00;
    @Test
    public void defaultTest() {
        System.out.println(setTime("8:00 am"));
        System.out.println(getLengthInCm());
time set to 8:00 am
15.0 cm

如果在某个时候我们往接口添加更多的默认方法,实现类可以不用修改继续使用。

默认方法的最典型用法是逐步为接口提供附加功能,而不破坏实现类。

此外,它们还可以用来为现有的抽象方法提供额外的功能:

interface MobilePhone {
     * 获取手机长度(毫米)
    Double getLength();
     * 对getLength方法进行拓展,返回厘米为单位的长度
    default String getLengthInCm() {
        return getLength() / 10 + "cm";

默认方法的多继承

Apple接口和Samsung接口继承MobilePhone接口:

interface Apple extends MobilePhone {
    @Override
    default String setTime(String newTime) {
        return "time set to " + newTime + " in apple";
interface Samsung extends MobilePhone {
    @Override
    default String setTime(String newTime) {
        return "time set to " + newTime + " in samsung";

DefaultTests实现Apple和Samsung接口,必须对setTime方法进行重写,否则对象将不知道该使用Apple的setTime方法还是Samsung的setTime方法,因为它们同名了

public class DefaultTests implements Apple, Samsung {
    @Override
    public String getBrand() {
        return "iphone";
    @Override
    public String getColor() {
        return "red";
    @Override
    public Double getLength() {
        return 150.00;
    @Override
    public String setTime(String newTime) {
        return Apple.super.setTime(newTime);
    @Test
    public void defaultTest() {
        System.out.println(setTime("8:00 am"));
        System.out.println(getLengthInCm());
time set to 8:00 am in apple
15.0 cm

在本文中,我们深入探讨了Java8中接口默认方法的使用。乍一看,这个特性可能有点马虎,特别是纯粹从面向对象的角度来看。理想情况下,接口不应该封装行为,而应该只用于定义特定类型的公共API。
但是在维护现有代码的向后兼容性时,静态方法和默认方法是一种很好的折衷。

概述Java8带来了一些全新的特性,包括lambda表达式、函数接口、方法引用、流、可选方法、接口中的静态方法和默认方法。在本文中,我们将深入讨论为什么java8接口新增了默认方法,如何使用默认方法,并讨论一些有用的用例。默认方法在接口中用default关键字定义接口的默认方法。普通接口方法是不能有实现的,默认方法必须有实现:public interface MyInterface { // 普通接口方法 default void defaultMethod
9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分。C#8.0的新特性之一就是默认接口实现。在本文中,我们将一起来聊聊默认接口实现。 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/12034584.html 提前说下: 这实际上是一种基于特性的编程技术,可以在几个无关之间进行方法的重用。不过的确有点反认知,毕竟接口方法不能进行实现,已经深入骨髓了。 一定要区分抽象接口的适用场景,抽象表述的对象,而接口表述的是..
Java8新特性Java8接口可添加默认实现接口和抽象的区别设计模式:缺省适配模式 Java8接口可添加默认实现 java8新增了接口默认实现功能,每个接口可以有默认实现实现可以根据其需要进行定制化得实现 抽象方法前面添加default关键字即可,代表该方法默认实现。 public interface UserService { String say(); default void Hello(){ System.out.println("this is interfac
方法方法定义定义方法返回值型推断方法参数默认参数带名参数变长参数方法调用方式操作符即方法花括号调用法无括号调用方法定义 一个可以有自己的方法,scala中的方法Java方法似。但scala与Java定义方法的语法是不一样的。 定义方法 def methodName (参数名:参数型, 参数名:参数型) : [return type] = { // 方法体:一系列的代码 参数列表的参数型不能省略 返回值型可以省略,由scala编译器自动推断 返回值可以不写return,默认就是{}块表达式的值 定义一个方法实现两个整形数值相加,返回相加后的结果 接口(是一种特殊的似于,有具体的属性,但是方法是抽象的方法) 定义: 关键字:interface(是class) 常量(似于的属性,但是1.常量必须给定初始值,且不能修改(final);2.两个关键字ststic、final; 3.接口调用常量,(static)接口名直接访问:直接通过(接口名.常量名),不用创建对象) 为了和属性区分开,一般默认大写常量 public (static final可以省去,默认加上的) 属性型 属性名 = 属性值; static:静态的,修饰的内容直接通过名/接口名直接访问; final;不可修改的,修饰属性,属性必须初始化 (不需要对象,不可修改) 抽象方法:public abstract 返回值方法名(参数型 参数名 ...) abstrac:抽象的,修饰方法方法是没有方法体的(没有方法实现,没有方法功能)。
原文链接:https://liushiming.cn/2020/02/23/java-default-methods/ Java8带来了一些全新的特性,包括lambda表达式、函数接口方法引用、流、可选方法接口中的静态方法默认方法。 在本文中,我们将深入讨论为什么java8接口新增了默认方法,如何使用默认方法,并讨论一些有用的用例。 默认方法接口中用default关键字定义接口的默...
很多时候,别人问我接口的区别的时候,我都会回答接口里面只能有抽象方法,而不能够有具体方法,但是今天看Mybatis源码的时候,发现了有一段代码是判断接口里面的默认方法的,于是我发现原来对接口的认识太过于肤浅了。 JDK1.8之后,在接口里面可以定义default方法,default方法里面是可以具备方法体的,当子实现接口之后,不需要重写该方法即可以调用方法。 ok,看看代码 接口定义 在JAVA中,接口的作用主要是定义该型实例具有的功能,也就是定义必须执行那些工作,而不关心如何进行这些工作。所以,在接口中定义的方法没有方法体,并且接口不允许定义实例变量。以下代码中定义名为MyInterface的接口,并且在该接口中定义了getInt方法,如果有实现了该接口,则根据JAVA语法,该必须实现getInt方法。 public interface MyInterface{ int getInt(); 使用接口的优势 接口的设计主要是为了支
由上可知默认方法是被default关键字修饰的方法,该方法是有方法体,并且该方法是可以不被接口实现重写的 那么JDK1.8为什么新添加默认方法: 都知道接口定义的方法如果是抽象的那么就会在实现中重写全部抽象方法,但是当我们想要对该接口进行扩展,添加新功能,那么在1.8之间只能定义抽象方法,这样导致了实现了这个接口的全部都要重写这个方法,导致了很多麻烦,
​ 在C#8.0中,针对接口引入了一项新特性,就是可以指定默认实现,方便对已有实现进行扩展,也对面向Android和Swift的Api进行互操作提供了可能性。下面我们来看看该特性的的概念、规则与示例代码。 一、什么是默认实现 顾名思义,默认实现就是接口中的成员可以进行实现,并作为该成员的一个默认实现,在以后,在实现接口的时候,如果实现了该接口的成员,则会被覆盖默认...
计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块 51907
handsomeboyguy: freemarker.core.NonHashException: For "." left-hand operand: Expected a hash, but this has evaluated to a sequence (wrapper: f.t.SimpleSequence): ==> zhiliang [in template "fr.opensagres.xdocreport.document.docx.DocxReport@5000a2a7!word/document.xml" at line 4, column 1024] ---- FTL stack trace ("~" means nesting-related): - Failed at: ${zhiliang.teachername} auto-escaped [in template "fr.opensagres.xdocreport.document.docx.DocxReport@5000a2a7!word/document.xml" at line 4, column 1022] ---- 我是报错这个表情包 Java导出Word文档的几种方法 qq_40082735: 我也是,解决了吗