参考资料:blog.csdn.net/zhwyj1019/a…
参考资料:www.runoob.com/java/java8-…
一、为什么要有这个特性?
首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
二、接口默认方法介绍
1.Java8中允许接口中包含具有具体实现的方法,这种方法被称为“默认方法”,使用default关键字修饰。如:
public interface MyInterface {
String notDefault();
default String testDefault() {
return "Hello Default Method";
}
}
2.该接口的实现类中只需要实现抽象方法即可,默认方法可以直接使用。
MyInterface myInterface = new MyInterface() {
@Override
public String notDefault() {
return "这不是一个default方法,实现类需要重写这个方法";
}
};
System.out.println(myInterface.notDefault());
System.out.println(myInterface.testDefault());
解释:就是说testDefault这个方法可以直接使用 只要把对象new出来就可以直接调用
三、接口中默认方法的“类优先”原则:
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
- 选择父类中的方法。如果一个父类中提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。 测试代码:
public class MySuperClazz {
public String testDefault() {
return "This is default method";
}
}
public interface MyInterface {
default String testDefault() {
return "Hello Default Method";
}
}
public class MyClazz extends MySuperClazz implements MyInterface{
}
MyClazz myClazz = new MyClazz();
System.out.println(myClazz.testDefault());
输出结果:
This is default method // 优先输出父类
输出结果:
This is default method
- 接口冲突,如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么实现类必须覆盖该方法来解决冲突。
public class MyClazz implements MyInterface,MyInterface2{
@Override
public String testDefault() {
return "测试两个接口中同名方法";
}
}
public interface MyInterface2 {
default String testDefault() {
return "Hello Default Method2";
}
}
public interface MyInterface {
default String testDefault() {
return "Hello Default Method";
}
}
输出结果:
测试两个接口中同名方法
四、接口中也可以声明静态方法
public interface MyInterface {
static void testStatic()
{
System.out.println("静态方法");
}
}