Java抽象和接口
抽象:
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法:
- 抽象方法用abstract修饰
- 抽象方法没有任何执行语句
- 因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)
- 无法实例化一个抽象类
- 抽象类用于被继承
- 抽象类可以强迫子类实现其定义的抽象方法(否则编译错误)
- 抽象方法实际上相当于定义了“规范”
- 面向抽象编程的本质:
- 上层代码只定义规范(abstract class Person)
- 不需要子类就可以实现业务逻辑(正常编译)
- 具体的业务逻辑由不同的子类实现,调用者并不关心
- 抽象方法定义了子类必须实现的接口规范
- 从抽象类继承的子类必须实现抽象方法
接口:
如果一个抽象类没有字段,所有方法全部是抽象方法,就可以把该抽象类改写为接口(interface)
- 使用interface声明一个接口
- 接口定义的方法默认是public abstract(不需要写)
public interface Person {
void run();
}
- implements实现接口interface
- 可以实现多个interface 多接口
注意区分术语:
- Java的接口特指interface定义的接口,只定义方法签名
- 编程接口泛指接口规范,如方法签名,数据格式,网络协议等
- 一个interface可以继承自另一个interface
- interface继承自另一个interface使用extends
- 相当于扩展了接口的方法
- 接口定义了纯抽象规范
- 类可以实现多个接口
- 接口也是数据类型,适用于向上转型和向下转型
- 接口不能定义实例字段
- 接口可以定义default方法
- 定义default方法可以使子类不实现该方法。子类也可以覆写该方法。