抽象类:如果一个类中包含抽象方法,那么这个类就是抽象类。在Java中,可以通过把类或者类中的某些方法声明为abstract(只能修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。
接口:接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java中接口通过关键字interface来实现。
只要包含一个抽象方法的类就必须被声明为抽象类,被声明为抽象的方法不能包含方法体。抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中的所有抽象方法提供具体的实现,否则他们也是抽象类。
接口可以被看作抽象类的变体。接口中所有方法都是抽象的,接口中成员变量都是static final类型。
相同点:
- 都不能被实例化
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化
不同点:
- 接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现
- 接口需要implements,而抽象类只能被extends,一个类可以实现多个接口,只能继承一个抽象类,因此使用接口可以间接达到多重继承的目的
- 接口强调特定功能的实现,has - a。抽象类强调所属关系,is - a
- 接口中方法只能用关键字public abstract修饰,接口中属性默认public static final,必须被初始化
- 接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不试用与日后重新对里面的代码进行修改。