浅谈Java的抽象类与接口

【本文参考自《Java程序员面试笔试宝典》】

【什么是抽象类】如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。只要包含一个抽象方法的类就是抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体,即不能有一对大括号。对于抽象类的实现上,抽象类的实现类必须包含相同的或者更低的访问级别(public->protected->private)。抽象类在使用的过程中不能被实例化,但是可以创建一个对象使它们指向具体子类的一个实例。抽象类的子类为父类中的所有抽象方法提供具体的实现,否则它们也是抽象类。

【什么是接口】接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java语言中,接口是通过interface来实现的。接口可以看作是抽象类的变体,接口中所有的方法都是抽象的,接口中所有的方法都是public、abstract的,而且只能被这两个关键字修饰,可以通过接口来间接地实现多重继承。接口中可以有成员变量,接口中的成员变量默认为public、static、final,即只能跟有静态的不能被修改的成员变量,而且接口中的成员变量必须给其赋初值

【抽象类与接口的相同点】

① 都不能被实例化。

② 接口的实现类或抽象类的子类都只有在实现了接口或者抽象类中的方法后才能被实例化。

【抽象类与接口的不同点】

① 接口只有定义,其方法在接口中是抽象的,不能在接口中实现(Java新特性下允许接口中的方法在接口中定义默认的实现方法),只能在实现接口的类中实现接口中定义的方法;而抽象类可以有非抽象方法,而抽象类中的非抽象方法是可以在抽象类中被实现的。

② 接口需要有一个类去实现(implements);抽象类需要有一个类去继承(extends)。并且一个类可以实现多个接口,但是一个类只能继承一个抽象类。因此使用接口可以间接地实现多重继承的目的。

③ 接口强调特定功能的实现,其设计理念是“has-a”关系;而抽象类强调的是所属关系,其设计理念是”is-a”关系。

④ 接口中的成员变量默认为public、static、final,即只能跟有静态的不能被修改的成员变量,而且接口中的成员变量必须给其赋初值。接口中的成员方法都是public、abstract的,而且只能被这两个关键字修饰;而抽象类中可以有自己的成员变量,也可以有非抽象的成员方法。抽象类中的成员变量默认为default,当然也可以被定义为public、protected或者private,这些成员变量可以在子类中被重新定义,也可以被重新赋值。但是抽象类中的抽象方法不能用private、static、synchronized、native等访问修饰符修饰。抽象方法不能有方法体,必须以分号结尾。

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

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

【补充】接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态main方法。

猜你喜欢

转载自blog.csdn.net/weixin_36378917/article/details/80672647