概述

  • 接口实际不是类,类是由Class定义,而接口是以interface定义的。
  • 更抽象的抽象类,只有常量和抽象方法
  • 定义的是一种准入规范
  • 接口可以通过(多)继承来实现准入规范的累加
  • 一个类可以实现多个接口
  • 接口属性默认为public static final,即把它们定义为常量,防止继承的不同接口中出现同名变量,防止继承的子类对常量进行更改(因为接口本身就是一种规范,要是常量还能被修改那它还定义这个常量干什么)
  • 接口方法默认为public abstract
  • 实现接口的类里也可以有自己的方法
  • 接口只能用public和default修饰,后者表示只能在本包写一个类去implement,包外则不能implement。不能用private是因为只能由自身去访问的接口无意义;不能用protected是因为它只比default多出包外的子类可以去访问,但接口并没有任何子类(子接口不叫子类,也不需要访问父接口的方法),所以也无意义。
  • 在接口中定义的内部类好像必须是静态的,或者是静态类型的,比如枚举类。
  • 很多人习惯在接口名前加一个“I”,表示interface
  • 接口不可以被new但是接口数组可以被new,比如,Comparable是一个接口,Comparable[] a=new Comparable[n]; (√)

优点

  • 统一访问:在创建对象的时候用接口创建,【接口名】 【对象名】= new 【实现接口的类】,这样你想用哪个类的对象就可以new哪个对象了,不需要改原来的代码。如果要写两个都有method1方法的类,如果用接口,就可以直接对象.method1();这样,new a()就是用a的方法,new b()就是用b的方法。
  • 曲线实现多重继承:java不支持多重继承但是可以实现多个接口,这个在某种程度上可以看成是多重继承的一种方法。
  • 项目开发便利:接口里是一些公用的东西,大家都去实现它的话比每次重新定义要方便。比如,开发时遇到客户改需求,多人修改代码导致牵连,如果使用接口,只需要重新写它的实现类即可。

    默认方法

  • Java8新特性:允许给接口添加一个|多个已经实现的方法,只需使用default定义即可,这个特征又叫做扩展方法
public interface Formula {
    default double sqrt(int a){
        return Math.sqrt(a);
    }

    double calculate(int a);
}
  • 实现Formula接口的子类需要重写calculate方法(当然,想要重写sqrt方法也可以),而sqrt则可以直接使用
public static void main(String[] args) {
    //这里不采用子类实现接口,而是直接在实例化的时候重写方法
    Formula formula = new Formula() {
        @Override
        public double calculate(int a) {
            return sqrt(a*100);
        }
    };
    formula.sqrt(100);
    formula.calculate(100);
}