默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个 default 关键字即可实现默认方法。
添加的默认方法,其所有的子类都默认继承,而无需重写。
为什么要有默认方法
在 java 8 之前,接口与其实现类之间的 耦合度 太高了,当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。这在 lambda 表达式作为 java 8 语言的重要特性而出现之际,为升级旧接口且保持向后兼容提供了途径。
使用默认方法的好处:
- 定义静态默认方法:在接口中定义静态默认方法,使得其所有继承接口的子类都可以调用这些静态方法,这样可以在接口中集中静态方法,其子类都可以分享,而无需将静态方法分开定义。
- 提供兼容性,如果已经发布的接口想要添加新的方法,只需要添加默认方法即可,子类无需做出任何改变。
默认方法语法格式:
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
默认方法继承发生冲突如何解决
接口默认方法可以被继承,如果一个类实现了多个接口,且这些接口中有命名相同的默认方法,此时就会产生冲突。
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
public interface FourWheeler {
default void print(){
System.out.println("我是一辆四轮车!");
}
}
解决方法有两个:
1、子类重写默认方法覆盖接口的默认方法;
2、使用 super 来调用指定接口的默认方法
//1、重写覆盖
public class Car implements Vehicle, FourWheeler {
default void print(){
System.out.println("我是一辆四轮汽车!");
}
}
//2、精确调用
public class Car implements Vehicle, FourWheeler {
public void print(){
Vehicle.super.print();
}
}
静态默认方法
java8支持接口中定义静态方法(需要提供默认实现),写法上将默认方法的default关键字换成static关键字即可。
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
// 静态方法
static void blowHorn(){
System.out.println("按喇叭!!!");
}
}
注意点
-
default
关键字只能在接口中使用(以及用在switch
语句的default
分支),不能用在抽象类中。 -
接口默认方法不能覆写
Object
类的equals
、hashCode
和toString
方法。 -
接口中的静态方法必须是
public
的,public
修饰符可以省略,static
修饰符不能省略。 -
即使使用了 java 8 的环境,一些 IDE 仍然可能在一些代码的实时编译提示时出现异常的提示(例如无法发现 java 8 的语法错误),因此不要过度依赖 IDE。