抽象类(abstract class)和接口(interface)有什么异同?

一个类中如果有抽象方法(abstract),则这个类就是抽象类,抽象类也可以包括非抽象方法。

接口是表示一个方法的集合,接口中的所有方法都没有方法体。

抽象类的子类要为父类中的所有抽象方法提供具体的实现,如果不实现某个抽象方法的话,就要在子类中继续声明这个方法是抽象的,即此时子类也是抽象类。

接口中的所有方法都是抽象的,接口里的成员变量默认也都是static final类型。由于抽象类可以包含部分方法的实现,所以在一些场合下抽象类比接口存在更多的优势。

接口与抽象类的相同点如下:

1、都不能被实例化。

2、接口的实现类或抽象类的子类只有实现了接口或抽象类的方法后才能被实例化。


接口与抽象类的不同点如下:

1、接口中只有定义,方法不能在接口中实现,只有实现接口的类才可以实现接口中定义的方法,而方法是可以在抽象类中被实现的。

2、接口是被实现的,抽象类是只能被继承的。一个类可以实现多个接口(因此使用接口可以间接的达到多继承的目的),但是一个类只能继承一个抽象类。

3、接口强调特定功能的实现,其设计理念是“has-a”关系(xx具有xx),而抽象类强调所属关系,其设计理念为“is-a”关系(xx是xx)。

4、接口中定义的成员变量默认为public static final ,只能够有静态的不能被修改的数据成员,而且必须给其赋初值。它的所有成员方法都是public abstract的(而且只能被这2个关键字修饰)。而抽象类可以有自己的数据成员变量,也可以有非抽象的方法。这些成员变量是可以在子类中重新定义和重新赋值的。

5、接口被运用于实现比较常用的功能,便于日后的维护或者添加删除方法。而抽象类更倾向于充当公共类的角色,不适用于日后的重新对里面的代码进行修改。


---------------------------

简单来说,接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作。但是一般而言,抽象类多用于同类事物中有无法具体描述的方法的场景。所以当子类和父类之间有逻辑上的层次结构时,推荐用抽象类。而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或更多的对象之间的特定交互行为时,使用接口。

另外, 接口可以继承接口,抽象类也可以实现接口,抽象类也可以继承具体类。

猜你喜欢

转载自blog.csdn.net/akanarika520/article/details/80246942