解释“接口”和“抽象类”:
在对他们进行比较之前,我们先来解释一下什么是接口?现实世界的接口通常是指两个不同物体之间相互交互所必须通过的一个"中介",没有这个"中介",两者就无法进行交互,我们把这个"中介"称为接口,例如:门窗户,楼道,插孔,电梯间等,但在软件世界中所提到的接口,有狭义和广义之分,狭义的接口是指某个程序设计语言所提供的API,广义的接口是指人与软件交互的图形界面,通过这个图形界面,人们才能使用此软件,JAVA中的接口是一种特殊的类,接口中只能包含常量和抽象方法,属于复合数据类型,是狭义的接口。,关于抽象类的解释大家可以去看这篇文章
相同之处:
1:都包含抽象方法,都不能被实例化
那么接口为什么不能被实例化呢?原因是:接口的定义和类很相似,分为接口声明和接口体两个部分,接口中能够定义的成员只有常量和抽象方法两种(或者两选一),不能包含构造方法,由于接口中只包含抽象方法,这就导致了它不能被实例化的原因和抽象类是相似的,而抽象类不能被实例化的原因我在之前的文章中有总结过,有需要的小伙伴可以去这里
2:他们的对象进行实例化操作的方法相同
无论是接口还是抽象类,虽然自身不能进行实例化操作,但由于抽象类和接口都是引用数据类型,可以声明抽象类和接口类型的引用变量,并将子类的对象实例赋给抽象类和接口变量,因此它们的对象都可利用其自身的多态性向上转型实现对接口或抽象类的实例化操作。对于向上转型这部分知识不懂的小伙可参考这篇文章
不同之处:
1:关键字不同:
对于接口,使用interface
修饰接口,它的子类使用implements
关键字实现该接口,而对于抽象类,使用abstract
用来修饰抽象类,它的子类使用extends
关键字继承该抽象类
2:组成不同
在抽象类中可以定义常量,变量,抽象方法,普通方法,构造方法
,而对于接口,在java8之前,接口中只能定义抽象方法和全局常量
,java8之后,接口中可以定义静态方法,但静态方法必须有方法体。
3:权限不同
抽象类可以使用各种权限,而接口的权限只能是public
4:关系不同
一个抽象类可以实现多个接口
,但接口不能继承抽象类
,可以继承多个接口
5:局限性
由于java单继承的限制,一个子类只能继承一个抽象类,但一个子类可以实现多个接口