Java7
Java7版本接口只能定义公共常量和公共抽象方法,在当前版本实现接口的类必须实现接口中的所有方法,这使得接口有时候维护会比较麻烦,接口有所改动时该接口的所有实现类均需要修改。
public interface Java7{
// public 和 final关键字可省略
int num = 10;
void test();
}
Java8
Java8版本接口在Java7的基础上新增default method,也称为虚拟扩展方法(Virtual Extension Methods),这个特性使得实现接口的类不需要将方法显示实现,直接在实现类中进行调用即可,当接口方法有所修改时,也不用去修改实现类。此外还新增了static method,被static修饰的方法不能被重写,只能通过接口本身进行调用。
public interface Java8{
// public 和 final关键字可省略
int num = 10;
default void defaultTest(){
System.out.println("default test");
}
static void staticTest(){
System.out.println("static test");
}
}
public class Java8Implements implements Java8{
public static void main(String[] args){
Java8Implements java8Implements = new Java8Implements();
//调用Java8接口方法
java8Implements.defaultTest();
//通过接口直接调用方法
Java8.staticTest();
}
}
Java9
Java9版本接口在Java8的基础上新增private method和private static method,它们均不能被重写,而且private method一般结合default method一起使用,private static method一般结合static method使用。
public interface Java9{
//default方法能够调用abstract/private/static/private static方法。
default void defaultTest(){
System.out.println("default test");
privateTest();
}
//static方法只能调用static和private static方法
//可以这样理解 非静态方法能够调用非静态方法(非静私有和公有)和静态(静态私有和公有)方法,而静
//态方法只能调用静态(静态私有和公有)方法
static void staticTest(){
System.out.println("static test");
privateStaticTest();
}
private void privateTest(){
System.out.println("private test");
}
private static void privateStaticTest(){
System.out.println("private static test");
}
}