1. 什么是抽象类

在面向对象编程中,我们通过类来描述事物,这个描述可以是抽象的,因为不可能通过类描述所有的属性和行为,可能同一类事物的不同个体有着行为上的差异。

例如我们想用一个类描述鸟的所有基本属性和行为,而所有的鸟都继承自这个类,我们可以把它称为基类。

而鸟的叫声是有差异的,我们很难在基类中定义鸟的这个行为,这时候我们就需要用到抽象方法了,将鸟叫这个行为用抽象方法描述,让子类对象自己去实现,而包含抽象方法的类也必须声明为抽象的,这就是抽象类。

总的来说就是:

抽象类可以使用抽象的方式描述事物的行为,具体的行为则让子类去实现。

2. 什么是接口

接口是比抽象类更加抽象的东西,它里面所有方法都是公开抽象的。接口只是提供了一个形式,而为提供任何具体实现。

用一个很形象的方式来描述接口就是:设计图。它可以和抽象类一样当作基类定义,但是它不包含任何实现。而它更有用的一个作用是用来作为类与类之间的“协议”,因为任何使用某特定接口的代码都知道它有哪些方法功能可以使用,而且仅仅需要知道这些。

3. 抽象类和接口的区别

用法和定义上的区别就不多说了,大家都知道,而这里主要说下它们的作用。

抽象类的主要作用是让子类去实现它的某一个方法,让子类提供某个实例,或者表现出不同的形式,例如ListView中BaseAdapter的getView方法。

而接口的主要作用是定义一个类与类之间的“协议”,它更像是被当作一个工具使用,实现类与类之间的解耦。也可以使用接口代替抽象类,但是你要确定这是不是必须的,否则会带来不必要的复杂性。

简单一句话区别抽象类在于:

抽象类的作用在于描述某一行为的抽象性,接口的作用在于定义“协议”。在没有考虑到这个“协议”是否有用时,不要滥用接口。如果你认为接口是扩展一个类的功能,这并没有错,但是你要确定这个功能是会被其它对象给用到,并且该对象也只专注于这个功能。