在JDK7以前,接口中只能声明抽象(abstract)方法和静态(static)常量,在JDK8中,接口可以声明静态方法(static)和默认(default)方法,而在JDK9中,接口还可以声明私有(private)方法。

在JDK7及以前

1
2
3
4
5
6
7
8
9
10
11
12
public interface MyInterface {

//定义常量,默认修饰符为 public static final ,可以省略
String CONTANT = "Contant";

//定义抽象方法.
void metod();

void method2();

// ...
}

在JDK 8中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public interface MyInterface {

String CONTANT = "Contant";

void metod();

//定义静态方法,静态方法只能通过类名调用,如: MyInterface.staticMethod();
//默认修饰符为 public
static void staticMethod(){
System.out.println("我是静态方法方法");
}

//定义默默认方法,默认方法只能通过对象调用,默认方法子类可以重写(Override)
//如果子类重写了接口中的默认方法,并且在默认方法中需要调用接口定义的默认方法,不能使用 super.DefaultMethod()这样调用 ,必须要加 接口名.super.默认方法来调用,如 MyInterface.super.defaultMethod()。
//默认修饰符为 public
default void defaultMethod(){
System.out.println("我是默认方法");
}

// ...
}

在JDK 9中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public interface MyInterface {

String CONTANT = "Contant";

void metod();

//定义静态方法,静态方法只能通过类名调用,如: MyInterface.staticMethod();
//默认修饰符为 public
static void staticMethod(){
System.out.println("我是静态方法方法");
}

//定义默默认方法,默认方法只能通过对象调用,默认方法子类可以重写(Override)
//如果子类重写了接口中的默认方法,并且在默认方法中需要调用接口定义的默认方法,不能使用 super.DefaultMethod()这样调用 ,必须要加 接口名.super.默认方法来调用,如 MyInterface.super.defaultMethod()。
//默认修饰符为 public
default void defaultMethod(){
System.out.println("我是默认方法");
}

private void privateMethod(){
System.out.println("我是私有方法");
}

// ...
}

一道很经典的面试题:抽象类与接口有什么不同?

  • 相同点
    都不能被实例化对象,必须使用子类或匿名类实例化,以多态的方式使用。
  • 不同点

    1、抽象类使用 abstract class 声明 ,接口使用 interface 声明;
    2、抽象类只能单继承、接口可以多实现;
    3、在jdk7 及以前:接口中只能有抽象方法和静态常量,在 jdk8 中,接口中可以有抽象方法、静态方法和默认方法、静态常量。在jdk9中,接口中还可以声明私有方法。