看上图,我们发现在Comparator这个函数式接口中竟然存在两个抽象方法 ,这就有了两个问题了?
- 函数式接口不是只能存在一个抽象方法吗?
- 假如真的可以写两个抽象方法,那么我们在实现Comparator接口时,不是应该都需要重写吗,为什么我们每次都只会重写compare这个方法呢?
下面是
@FunctionalInterface
这个接口的文档注释我们可以发现:
- default 实现了的抽象方法并不计入
函数式接口所说的抽象类个数中
- 如果一个接口中声明的抽象方法是重写了超类
Object
类中任意一个 public 方法,那么也将不计入,因为任何接口的实现都会从其父类Object
或其它地方获得这些方法的实现。
超类优先
假设有
类A,类B,接口C
;A 继承了 B,且重写了C;但是B,C存在相同的方法,则A如果不重写的话,优先使用 类B的,而不是接口C的
class B {
public void run() {
System.out.println("B: run()");
}
}
@FunctionalInterface
interface C {
void run();
// 本质是要重写object类中的equals,但是不重写的话,就默认直接使用object中的equals
boolean equals(Object o);
}
public class A extends B implements C {
public static void main(String[] args) {
A a = new A();
a.run();
}
}