今天偶然看到了接口中的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开出了发票
将发票发送给了用户
总结:使用感觉还不错。如果按正常来写,只能是先写接口,俩个公司各做实现。由于发送模式相同,这样不可避免造成了代码的冗余。 新接口使得后续在添加新公司的时候更加便捷。如果发送方式不一样了,也可以重写发送接口,这个大家可以试一试。
思考:如果俩个接口是继承关系,他们又有同一个默认方法,那么他的实现调用时会发生什么呢?
我的写作思路很简单,工作中遇到问题->学习、思考->应用到工作。可能不是太深。所以非常希望大家能够留下自己的见解,一起探讨,一起进步。