1.Java接口默认方法
从Java8开始,接口允许定义默认方法
格式:
public default 返回值类型 方法名称(参数列表){
// ...
}
备注:接口当中的默认方法,可以解决接口升级的问题
public可以省略不写,但是default必须要有
什么是接口升级的问题?
因为接口的实现类必须实现接口的所有抽象方法,但是,当接口中新添加一个抽象方法,而接口的实现类都已经用于实际的生产活动中,要是把这些实现类再改变,则会其他与这些实现类相关的都受到了牵连。如何保证这些实现类固定不动,但是又要在接口中能新添加抽象方法,这时候,我们就让新添加的方法拥有一种默认的方法体。
新添加一个抽象方法后,两个实现类出现报错
修改:
默认方法会被实现类继承下去
新加的方法,MyInterfaceDefaultA和MyInterfaceDefaultB都不用改,却可以调用它。
运行结果:
总结:
(1)接口的默认方法,可以通过接口实现类对象,直接调用
(2)接口的默认方法,也可以被接口实现类进行覆盖重写
运行结果:
2.接口的静态方法
从Java8开始,接口中允许定义静态方法
格式:
public static 返回值类型 方法名称(参数列表) {
方法体
}
提示:就是将abstract或者default换成static即可,带上方法体。
注意:
不能通过接口实现类的对象来调用接口当中的静态方法
接口实现类
正确用法:
通过接口名称,直接调用其中的静态方法
格式:
接口名称.静态方法名(参数);
3.接口的私有方法
背景:
如果有方法体的两个方法之间重复的内容太多了,我们就要抽取出来。我们需要抽取出来一个共有方法,用来解决两个默认方法之间的重复代码的问题。
但是这个共有方法不应该让实现类使用,应该是私有化的。
修改后:抽取出共有方法
但是这种修改方式,实现类也能调用这个默认方法methodCommon,我们的目标只想methodCommon()方法只被methodDefault1和methodDefault2调用。
解决方案:
从Java9开始,接口中允许定义私有方法
(1)普通私有方法:解决多个默认方法之间重复代码问题
格式:
private 返回值类型 方法名称(参数列表){
方法体
}
(2)静态私有方法:解决多个静态方法之间重复代码问题
格式:
private static 返回值类型 方法名称(参数列表){
方法体
}
修改后:
注意:private的方法只有接口自己才能使用,不能被实现类或别人使用