Java基础:接口的【默认方法】可在新增方法时保护已有实现类

首先,我们有一个接口,接口内有一抽象方法methodAbstract1

public interface MyInterface { // 注意用interface而不是class
    public abstract void methodAbstract1(); 
    // public和abstract可有可无但不能写别的,比如private
}

该接口有以下MyInterfaceA、B两个实现类,实现类必须对接口中所有抽象方法进行覆盖重写如下,覆盖后AB两个实现类已投入使用

public class MyInterfaceA implements MyInterface {
    // 原本的extends变成了implements
    @Override
    public void methodAbstract1() {
        System.out.println("实现了抽象方法A");
    }
}
// 以下是在另一个.java文件中的另一个类
public class MyInterfaceB implements MyInterface {
    @Override
    public void methodAbstract1() {
        System.out.println("实现了抽象方法B");
    }
}

倘若需要升级这个接口,如需要新增方法,直接在下面添加新抽象方法methodAbstract2()会报错,因为接口的实现类AB必须覆盖重写接口的所有抽象方法,新增的方法并未被已投入使用的实现类AB重写。那么该如何升级接口的同时,保护以投入使用的实现类AB呢?

public interface MyInterface {
    public abstract void methodAbstract1();
    public abstract void methodAbstract2(); // 本句会使AB报错
}

答:接口中的默认方法,可以解决接口升级问题。从Java 8开始,接口中允许定义默认方法

public interface MyInterface {
    public abstract void methodAbstract1();
    // public abstract void methodAbstract2();

    public default void methodAbstract2() {
        System.out.println("这是新增的默认方法");
        // public可有可无但不能写别的,比如private。而default不能省略
    }
}

再写个main文件,调用默认方法时,如果实现类中没有,会向上找接口

public class Demo {
    public static void main(String[] args) {
        MyInterfaceA A = new MyInterfaceA();
        A.methodAbstract1(); // A中重写的方法
        A.methodAbstract2(); // 这是后来新增的,A类中并没有重写
        // 上句不会报错,调用默认方法时,如果实现类中没有,会向上找接口

        MyInterfaceB B = new MyInterfaceB();
        B.methodAbstract1();
        B.methodAbstract2(); // B也一样,虽没重写但也可调用默认方法
    }
}

/*
实现了抽象方法A
这是新增的默认方法
实现了抽象方法B
这是新增的默认方法
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值