杂谈——抽象类(abstract class)与接口(interface)有什么异同

初学Java的小伙伴们在学习抽象类和接口的时候有很大的可能会弄得一头雾水,毕竟这两玩意好像有很多相似的地方。

今天我们就一起来梳理梳理抽象类与接口之间有什么异同。

好æä¸æ¼è¡¨æå

1.抽象类与接口

如果一个类中包含抽象方法,那么这个类就是抽象类。

在Java语言中,可以通过把类或者类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。

接口就是指一个方法的集合,接口在红的所有方法都没有方法体,在Java语言中,接口是通过关键字interface来实现的。

抽象类和接口都是支持抽象类定义的两种机制。这里需要注意一点,这里说的抽象类与上文中说的抽象类的意义不一样,上文中说到的抽象类指的是一个实体,而这里表示的则是一个概念。

这两种机制具有很大的相似性,甚至在很多时候是可以互换的。但同时,二者也存在很大的区别。

2.抽象类与接口的特性

只要包含一个抽象方法的类就必须声明为抽象类,抽象类可以声明方法的存在而不能实现它,被声明为抽象的方法不能包含方法体。在实现的时候,必须包含相同的或者更低的访问级别(public——>protected——>private)。此外,抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中的所有抽象方法提供具体的实现,否则它们也是抽象类。

接口可以被看作抽象类的变体。接口在红的所有方法都是抽象的,可以通过接口来间接地实现多重继承。接口中的成员变量都是static final类型。由于抽象类可以包含方法的实现,因此,在一些场合下抽象类比接口存在更多的优势。

3.抽象类与接口的异同

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

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

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

  • 接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中的方法,而抽象类可以有定义与实现,即起方法可以在抽象类中被实现。(在jdk1.8之后接口中也可以有方法体了
  • 接口需要实现(用implements),但抽象类只能被继承(extends)。一个类可以有多个接口,但是一个类只能继承一个抽象类,因此接口可以间接地达到多重继承的目的
  • 接口强调特定功能的实现,其设计理念是“has - a”关系;而抽象类强调所述关系,其设计理念为“is - a”。
  • 接口中定义的成员变量默认为public static final,只能够有静态达到不能被修改的数据成员,而且,必须给其赋初值,其所有成员方法都是public、abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法。而且,抽象类中的成员变量默认为default(本包可见),当然,也可以被定义为private、protected和public,这些成员变量可以在子类中被重新定义,也可以被重新复制。抽象类中的抽象方法(其前有abstract修饰)不能用private、static、native、synchronized等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。所以,当功能需要累积时,用抽象类;不需要累积时,用接口。
  • 接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类则更倾向于充当公共类的角色,不使用与日后重新对里面的代码进行修改。

4.总结

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

此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类,抽象类也可以有静态的main方法。

 

好啦,以上就是关于抽象类与接口之间的异同的相关知识总结啦,如果大家有什么好的见解或者发现文中有描述不当的地方,欢迎大家留言评论,我们一起学习呀~~

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/84641608