一、碰到问题:
接口有多个默认或静态方法?不是要全部抽象才成为接口吗?
二、解答:
在Java 8之前的版本中,接口只能包含抽象方法,即那些没有具体实现的方法。然而,从Java 8开始,接口中引入了两种新的方法类型:默认方法(default methods)和静态方法(static methods)。
- 默认方法:默认方法是接口中带有默认实现的方法。这意味着实现接口的类可以选择使用默认实现,也可以覆盖这个方法提供自己的实现。这样做的一个优点是能够向现有接口添加新方法而不破坏现有的实现。
public interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method");
}
}
- 静态方法:静态方法是属于接口本身,而不是接口的实例的方法。它们可以直接通过接口调用,而无需实现或实例化接口。
public interface MyInterface {
static void staticMethod() {
System.out.println("This is a static method");
}
}
即使一个接口包含了默认方法或静态方法,它仍然是一个接口。而函数式接口的定义是仅有一个抽象方法的接口。这并不排除接口有其他类型的方法,如默认方法或静态方法。实际上,函数式接口可以包含任意数量的默认和静态方法,但必须只有一个抽象方法。这样,它们仍然可以配合lambda表达式使用。
例如,以下是一个有效的函数式接口:
@FunctionalInterface
public interface MyFunctionalInterface {
void abstractMethod(); // 抽象方法
default void defaultMethod() {
// 默认方法的实现
}
static void staticMethod() {
// 静态方法的实现
}
}
在这个例子中,MyFunctionalInterface
只有一个抽象方法abstractMethod
,因此它是一个有效的函数式接口,尽管它还包含了一个默认方法和一个静态方法。这个接口可以与lambda表达式一起使用,因为它满足函数式接口的要求。