个人理解:抽象类是在接口和实体类之间的一个桥梁。是在抽象和具体之间的一个过度。
先看共性:
- 都不能直接实例化,接口要被实现,抽象类要被继承。但是抽象类可以有构造器。
- 都含有抽象方法。
- 都可以继承接口,抽象类还可以继承其他类。抽象类也是类的一种,因此一个类只能继承一个抽象类,而可以实现多个接口。
不同:
- 接口中所有的变量都是static和final的,而抽象类可以有普通的变量。
- 关于接口中几乎所有方法都是抽象的(jdk1.8后还可以有默认方法)。而抽象类中可以含有具体实现的方法,也含有抽象方法,含有抽象方法的类就是抽象类。
- 接上一条,实现接口的实现类必须实现接口的所有抽象方法。抽象类子类可以实现父类一部分抽象方法,成为一个抽象的子类,也可以实现全部抽象方法,成为一个普通的类。
- 抽象类可以有普通的方法的实现,当其子类不重写普通方法时,就会默认执行父类的方法。
- 抽象类比接口速度快。
可以看出,抽象类是介于接口和普通类之间的一种类,它同时具有二者的一些特性。
在添加新方法时,抽象类具有更灵活的特点,如果新方法是普通方法,则抽象类的子类不需要做更改即可得到这些方法。
而接口则需要所有子类做出更改,因为接口的实现类必须重写接口中所有的抽象方法。在jdk1.8中增加的default方法就是为了提高接口的扩展性,接口中的默认方法不需要被实现类重写。