# 概念 如果一个抽象类没有字段,所有方法全部是抽象方法。就可以把该抽象类改写为接口。 ```java class Student implements Person{ private String name; public Student(String name){ this.name = name; } @Override public void run(){ System.out.println(this.name+"run"); } @Override public String getName(){ return this.name; } } ``` 一个类可以实现多个interface。 ```java class Student implements Person, Hello{ ... } ``` 区分两个接口。Java接口特指interface定义的,表示一个接口类型和一组方法签名;编程接口API泛指接口规范。 # 接口继承 一个interface可以继承自另一个interface,相当于扩展了接口规范。 ```java interface Hello{ void hello(); } interface Person extends Hello{ void run(); String getName(); } ``` 合理设计`interface`和`abstract class`的继承关系,可以充分复用代码。一般来说,公共逻辑适合放在`abstract class`中,具体逻辑放到各个子类,而接口层次代表抽象程度。在使用的时候,实例化的对象永远只能是某个具体的子类,但总是通过接口去引用它,因为接口比抽象类更抽象。 ```java List list = new ArrayList(); //用List接口引用具体子类的实例 Collection coll = list; //向上转型为Collection接口 Iterable it = coll; //向上转型为Iterable接口 ``` # default方法 在接口中,可以定义`default`方法。例如,把`Person`接口的`run()`方法改为`default`方法。 ```java public class Main{ public static void main(String[] args){ Person p = new Student("Xiao ming"); p.run(); } } interface Person{ String getName(); default void run(){ System.out.println(getName()+" run."); } } class Student implements Person{ private String name; public Student implements Person{ this.name = name; } public String getName(){ return this.name; } } ``` 实现类可以不必覆写`default`方法。`default`方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是`default`方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。`default`方法和抽象类的普通方法是有所不同的。因为`interface`没有字段,`default`方法无法访问字段,而抽象类的普通方法可以访问实例字段。