# 概念
如果一个抽象类没有字段,所有方法全部是抽象方法。就可以把该抽象类改写为接口。
```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`方法无法访问字段,而抽象类的普通方法可以访问实例字段。