一,前言
java8 Lambda函数式编程的推出,定义了函数式接口。@FunctionalInterface,允许一个接口中只能有一个方法。可能是为了和之前接口的兼容允许在接口中定义默认方法和静态方法,但声明静态方法的时候要有实现。
/**
* @author lwc
*/
@FunctionalInterface
public interface MyInterface {
//函数式接口有且只有一个方法
void test();
default String getName() {
return "MyInterface Name";
}
static void show() {
System.out.println("接口中的静态方法");
}
static void show2() {
System.out.println("接口中的静态方法2");
}
}
二,特性
接口默认方法的”类优先”原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法) ,那么必须覆盖该方法来解决冲突。
举例说明
定义一下接口和类
public interface MyInterface1 {
static void show() {
System.out.println("接口中的静态方法");
}
default String getName() {
return "MyInterface1 Name";
}
}
public interface MyInterface2 {
default String getName() {
return "MyInterface2 Name";
}
}
public class MyClass {
public String getName() {
return "MyClass Name";
}
}
public class TestDefaultInterface {
public static void main(String[] args) {
SubClass sc = new SubClass();
System.out.println(sc.getName());
MyInterface1.show();
}
}
当子类继承SubClass实现MyInterface1时,TestDefaultInterface输出结果为
public class SubClass extends MyClass implements MyInterface1 {
}
public class SubClass extends MyClass implements MyInterface1, MyInterface2 {
}
public class SubClass extends MyClass implements MyInterface2 {
}
MyClass Name
接口中的静态方法
当子类实现两个接口时候编译异常,必须实现其中一个接口的方法
public class SubClass implements MyInterface1, MyInterface2 {
@Override
public String getName() {
return MyInterface1.super.getName();
}
// @Override
// public String getName() {
// return MyInterface2.super.getName();
// }
}
MyInterface1 Name
接口中的静态方法MyInterface2 Name
接口中的静态方法
结束语
上古的烽烟早已在岁月中逝去,黄河古道虽几经变迁,但依旧在。