抽象类与接口的区别
- 类可以实现很多个接口,但是只能继承一个抽象类
- 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。(Java8 接口可以有实例方法 需要关键字default)
- Java接口中声明的变量默认是public static final(必须赋初始值)。抽象类可以包含非final的变量。
- Java接口中的成员函数默认是public abstract的。抽象类的成员函数可以是private,protected或者是public。
- 接口可继承接口,不能继承类(抽象类和普通类) 抽象类可继承接口也可继承具体类(继承接口时可只实现部分方法)
- 非抽象类如果要实现一个接口,它必须要实现接口声明的所有方法。类可以不实现抽象类或接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
相同点:
- 都不能被实例化
- 接口的实现类和抽象类的子类只有全部实现了接口或者抽象类中的方法后才可以被实例化
- 都包含虚方法或抽象方法
- 可以通过继承和实现的方法实现其抽象方法
不同点:
- 接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。
- 单继承,多实现。接口可以实现多个,只能继承一个抽象类。
- 接口强调的是功能,抽象类强调的是所属关系。
- 接口中的所有成员变量 为public static final, 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。