前言
在java8中可以有默认方法和静态方法了。其中接口的默认方法的出现,使java可以类似的实现多重继承,并且也消除了适配器模式。静态方法的出现,可以方便我们编写工具类,而不需要像以前一样,再自己私有化构造器。
default方法是一个无奈之举,在Java 7及之前要想在定义好的接口中加入新的抽象方法是很困难甚至不可能的,因为所有实现了该接口的类都要重新实现。试想在Collection接口中加入一个stream()
抽象方法会怎样?default方法就是用来解决这个尴尬问题的,直接在接口中实现新加入的方法。既然已经引入了default方法,为何不再加入static方法来避免专门的工具类呢!
案例
水生动物接口
其中breath()方法和陆生动物接口中的breath()方法方法签名一样.用于演示接口出现冲突的情况(结论:要重写冲突的方法)
/**
* @describe:水生动物
* @Date:2020/4/26 17:13
* @author:wbx
*/
@FunctionalInterface
public interface IWaterAnimal {
void swim();
default void breath(){
System.out.println("IWaterAnimal--我在水里呼吸..");
}
}
陆生动物接口
其中openMouth方法和下面BigMouth中的openMouth方法方法签名一样,用于演示继承来的方法和接口中的默认方法冲突的情况(结论:继承来的接口优先)
其中count()方法,用于演示接口中可以写静态方法.
/**
* @describe:陆生动物
* @Date:2020/4/26 17:13
* @author:wbx
*/
@FunctionalInterface
public interface ILandAnimal {
void walk();
default void breath(){
System.out.println("ILandAnimal--我在陆地上呼吸..");
}
default void openMouth(){
System.out.println("我是ILandAnimal接口中的方法,我要张开嘴巴..");
}
//接口里可以直接写静态方法了
static void count(){
System.out.println("统计动物的数量");
}
}
/**
* @describe:
* @Date:2020/4/26 17:22
* @author:wbx
*/
public class BigMouth {
public void openMouth(){
System.out.println("我是类中的方法,我要张开嘴巴..");
}
}
青蛙类继承了BigMouth类,并实现了IwaterAnimal和ILandAnimal接口
/**
* @describe:青蛙,属于两栖类
* @Date:2020/4/26 17:16
* @author:wbx
*/
public class Frog extends BigMouth implements IWaterAnimal, ILandAnimal {
@Override
public void walk() {
System.out.println("我在陆地上走");
}
@Override
public void swim() {
System.out.println("我在水里游泳");
}
/**
* 注意:当实现的多个接口有相同的默认方法的时候,要重写该方法
*/
@Override
public void breath() {
IWaterAnimal.super.breath();
}
}
测试
/**
* 接口的默认方法可以实现多重继承
*
* @param args
*/
public static void main(String[] args) {
Frog frog = new Frog();
frog.swim();
frog.walk();
//1.如果两个接口中有相同方法签名的默认方法,子类必须实现冲突的方法.
frog.breath();
//2.如果父类里面有一个方法和接口中一个默认方法有相同的方法签名,那么使用的是父类的方法.
// (推论: 你永远不要期望通过接口你的默认方法来改变Object对象里面的方法)
frog.openMouth();
//3.接口里可以直接写静态方法了
ILandAnimal.count();
}