Java8新特性——接口的默认方法(或扩展方法)

今天偶然看到了接口中的default方法,想起之前面试也聊过几次,便了解了一下。

官方文档通道:http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

简单定义:Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做默认方法(扩展方法

  • 默认:接口中已实现,实现类可直接使用
  • 扩展:实现类还可以重写

 注:默认方法不可以重写Object中的方法,可以重载Object中的方法。

光学不练假把式,接下来应用下试试。

业务场景:一个开发票的功能,由俩个公司来实现,现在要把开出的发票发送给用户,俩个公司的模式基本一样(获取发票号和用户手机,推送发票)

首先确认一下开票功能

public interface InvoiceCompany {
    //开发票
    void makeInvoice();
}


public class InvoiceCompanyA implements InvoiceCompany {

    @Override
    public void makeInvoice() {
        System.out.println("公司A开出了发票");
    }
}


public class InvoiceCompanyB implements InvoiceCompany {

    @Override
    public void makeInvoice() {
        System.out.println("B公司开出了一张发票");
    }
}

有兴趣的同学可以看下我的上一篇文章,介绍使用工厂模式来实现开发票,附地址

https://blog.csdn.net/Gavin_Java_/article/details/106805489

新特新参与:默认方法添加

public interface InvoiceCompany {
    //开发票
    void makeInvoice();
    //发送邮件
    default void sendEmail() {
        System.out.println("将发票发送给了用户");
    }
}

测试

public class DefaultTest {
    public static void main(String[] args) {
        InvoiceCompanyA invoiceCompanyA = new InvoiceCompanyA();
        invoiceCompanyA.makeInvoice();
        invoiceCompanyA.sendEmail();
    }
}


输出结果:公司A开出了发票
         将发票发送给了用户

总结:使用感觉还不错。如果按正常来写,只能是先写接口,俩个公司各做实现。由于发送模式相同,这样不可避免造成了代码的冗余。 新接口使得后续在添加新公司的时候更加便捷。如果发送方式不一样了,也可以重写发送接口,这个大家可以试一试。

思考:如果俩个接口是继承关系,他们又有同一个默认方法,那么他的实现调用时会发生什么呢?

我的写作思路很简单,工作中遇到问题->学习、思考->应用到工作。可能不是太深。所以非常希望大家能够留下自己的见解,一起探讨,一起进步。

猜你喜欢

转载自blog.csdn.net/Gavin_Java_/article/details/106826584