一、接口中的默认方法
Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰
public interface MyInterfce {
default String getName(){
return "MyInterfce interface";
}
}
这其实对接口的使用更加友好了,在Java8之前,接口中只能有抽象的方法,如果接口中增加了业务方法,那实现该接口的那些类就都得进行修改,如果是我们已经封装好的业务类,那就得对原来的代码进行修改。现在有了默认方法的支持以后,我们可以对新增的业务直接在接口中写实现,然后可以正常调用,扩展性显然更友好。这就带来了一个新的问题:若一个接口中定义了一个默认方法,而另外一个父类或接口中定义了一个同名的方法时子类在调用这个同名方法时该怎么处理呢?
接口默认方法的 ” 类优先 ” 原则:
若一个接口中定义了一个默认方法,而另外一个父类或接口中定义了一个同名的方法时:
选择父类中的方法(父类与接口默认方法具有相同参数列表和方法名时):如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
父类:
public class MyClass {
public String getName(){
return "MyClass class";
}
}
接口
public interface MyFunction {
default String getName () {
return "MyFunction interface";
}
}
子类:
public class SubClass extends MyClass implements MyInterfce {
}
测试:
public static void main(String[] args) {
SubClass sc = new SubClass();
System.out.println(sc.getName());
}
输出:MyClass class
接口冲突(子类实现的两个接口中具有相同参数列表且同名的默认方法时):如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法
接口1:
public interface MyInterfce {
default String getName(){
return "MyInterfce interface";
}
}
接口2:
public interface MyFunction {
default String getName () {
return "MyFunction interface";
}
}
子类:
public class SubClass implements MyFunction, MyInterfce {
}
此时子类就报错了,因为这种情况下子类对象调用该同名方法时就不知道怎么选择了,所以此时必须重写该同名方法,调用的时候直接忽略掉接口的方法,使用自己的:
public class SubClass implements MyFunction, MyInterfce {
@Override
public String getName() {
return null;
}
}
此时不再报错。这里还有另外一种情况:如果此时子类还继承了具有相同参数列表和方法名的类时(该类中的这个方法为非抽象方法),也不会报错,因为根据前面的“类优先原则”,此时子类对象如果调用该方法直接选择父类中的方法即可:
二、接口中的静态方法
Java8中,接口中允许添加静态方法
public interface MyFunction {
//静态方法
static void show(){
System.out.println("MyFunction interface static method");
}
}
调用和类一样:
MyFunction.show();
输出:MyFunction interface static method