定义
抽象类:它是一种特殊的、不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface关键字声明。
相同点
1 两者都是抽象类,都不能实例化。
2 interface实现类及abstract class的子类都必须要实现已经声明的抽象方法。
区别
1 从关键字implement看,表示实现,既interface表示需要具体的类去实现;
而关键字extends表示为扩展,abstract class需要继承的方式让子类实 现功能。
2 抽象类中有数据成员,可以实现数据的封装;
接口没有数据成员。
3 抽象类中可以有构造方法;
接口没有构造方法。
4 抽象类的方法可以通过private、protected、public关键字修饰(抽象方法 不能是private);
接口中的方法只能使用public关键字修饰。
5 一个类只能继承于一个抽象类;
一个类可以同时实现多个接口。
6 抽象类中可以有成员方法的实现代码;
而接口中不可以有成员方法的实现代码。
7 abstract class 强调所属关系;
interface强调特定功能的实现;
8 interface中的每一个方法都是抽象方法,都只是声明的(declaration,没有方法体),实现类必须要实现;
abstract class的子类可以有选择地实现。这个选择有两点含义:
a) abstract class中并非所有的方法都是抽象的,只有那些冠有abstract 的方法才是抽象的,子类必须实现。那些没有abstract的方法,在 abstract class 中必须定义方法体;
b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
应用场合
interface
1 类与类之间需要特定的接口进行协调,而不在乎其如何实现。
2 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
3 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
4 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。
abstract
1 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
2 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
3 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能。