Java 8 允许在接口中定义默认方法.默认方法必须使用 default 修饰,该方法不能使用 static 修饰,无论程序是否指定,默认方法总是使用 public 修饰.如果开发者没有指定 public ,系统会自动为默认方法添加 public 修饰符.由于默认方法并没有 static 修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法.
Java 8 允许在接口中定义类方法,类方法必须使用 static 修饰,该方法不能使用 default 修饰,无论程序是否指定,类方法总是使用 public 修饰.如果开发者没有指定 public ,系统会自动为类方法添加 public 修饰符.类方法可以直接使用接口来调用.
接口定义实例
public interface Output {
int MAX_CACHE_LINE = 50;
void out();
void getData(String msg);
// 在接口中定义默认方法
default void print(String... msg) {
Arrays.asList(msg).forEach(m -> System.out.println(m));
}
default void print_v2(String... msg) {
for (String m : msg) {
System.out.println(m);
}
}
// 在接口中定义静态方法
static String staticTest() {
return "接口里的静态方法";
}
static String staticTest_v2() {
return "接口里的静态方法_v2";
}
}
public class OutputImpl implements Output {
@Override
public void out() {
System.out.println("out invoke");
}
@Override
public void getData(String msg) {
System.out.println("getData invoke");
}
}
使用实例
Output output = new OutputImpl();
// 常规接口方法调用
output.out();
output.getData("hello");
// default方法调用
output.print("hello", "indian mi fan", "are you ok?");
output.print_v2("thank", "you");
// static方法调用
System.out.println(Output.staticTest());
System.out.println(Output.staticTest_v2());
// 不能通过接口的实现类直接调用接口的static方法OutputImpl.staticTest();
总结
- 接口的 default(默认) 方法可以提供方法实现体
- 接口的实现类可以不实现 default(默认) 方法
- 接口的实现类可以实现 default(默认) 方法
- 接口的实现类的实例可以直接使用 default(默认) 方法
- 接口的 static(静态) 方法只能被接口直接调用.不能被接口的实现类调用
- 接口的 default(默认) 方法与 static(静态) 方法都可以定义多个
接口的 default 方法与 static 方法都不可以使用 final 进行修饰
static 方法不能使用 final 修饰这个很容易理解, staitc 方法是属于接口的方法,不会被实现类重写.
default 方法不能被 final 修饰,个人的理解是 default 方法本质上是一个"有实现体"的接口抽象方法,为所有实现类提供一个默认的实现,而这个 default 方法和其他抽象方法一样,被设计出来就希望是被实现类进行重写的.
假设 default 方法可以被 final 修饰,则这个方法就不能被接口的所有实现类重写,也就是说这个方法只能有一种实现,那不就和 static 方法一样了吗?那直接将这个方法设计为 static 方法就好了.
注:重写( override )是在继承与多态的概念下才有的.
而 static 修饰的对象则属于类本身,与继承多态并无关联.
参考
《疯狂Java讲义》
Why is “final” not allowed in Java 8 interface methods?
网友评论