Java interface 里可以定义变量和方法,变量必须并且默认是 public static final,方法必须并且默认是 public abstract。Java 8 interface 中除了引入了默认方法外,还引入了静态方法。类似于默认方法,在接口中定义静态方法只需要在方法前加入 static 关键字。

1
2
3
4
5
public interface InterfaceE{
static void func(){
System.out.println("IE");
}
}

特点

  • 接口中的静态方法只能通过接口本身去调用,类似于 Class 中的静态方法,因此也没有默认方法中的多继承问题;
  • 接口中的静态方法并不能在实现类中被覆写,实现类中可以声明相同的方法,但这两个方法之间除了名字相同,并没有 Override 关系。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //调用
    public void t2(){
    InterfaceE.func();
    }

    //无法被 Override
    public class ClassE implements InterfaceE{
    public static void func(){
    System.out.println("CE");
    }
    }

优点

静态方法以及默认方法的引入允许我们在接口中直接实现公有方法,带来了如下的好处:

  • 减少额外的工具类的创建
  • 避免创建基类
  • 更好地支持集合的 API 在 lambda 表达式中应用

注意

接口中的静态方法和默认方法不能和所有对象的基类 Object 中的方法同名,即这两种方法不能提供 Object 中的方法的实现。原因:1.保持继承模型的简单性;2.接口本身是无状态的,而 Object 中的 equals/hashCode/toString 方法依赖于对象的状态;3.允许对这些方法的实现可能会带来潜在的不可预知的表现。