昨天被学妹问住了这个问题,只能说出个大概,而说不清具体。让我看清了自己有多low,赶紧研究记录下。
从语法层面来讲:
-
抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract(默认) 方法
-
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final(默认)类型的
-
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
-
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
从设计层面上来讲:
-
抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
比如狗和车子,它们的共性就是跑路,设计它们一个是Dog类,一个是Car类
它们完全不是同一个类的(属性),但是现在它们有一个共性的行为-----跑路
这时候设计一个Run接口,Dog类和Car类就可以根据需求来实现这个Run的接口
狗和车子就都能跑了,狗吐槽为啥要拿它和车子比,它能跑得过五菱宏光吗?
现在又有一个抽象People类,也可以按需来实现Run接口,你问我:ZhangShang这个类能不能跑路?你直接继承People类就行了。 -
抽象类的继承关系,它是很多子类的父类,父子之间是 是不是的关系,就比如小王到底是不是老王的儿子,老王到底有几个儿子?
抽象类它是一种模板式设计,老王偷偷生了小明,小美,小吕,邻居们都说他们仨长的跟老王一样的,所以,他们仨的脸就是父类的公共部分,老王的脸就是一种模板 -
接口是一种行为规范,它的实现者可以五花八门,是动物类,是植物类,是神仙类。接口与实现类之间是有没有,能不能的关系,就拿上面例子来说,狗能不能跑路?车子能不能跑路?人类有没有跑路这种行为?
接口它是一种辐射式设计,拿 lol 当一个接口,接口有wegame启动和客户端启动方式,以前打lol是可以直接启动客户端,但是现在腾讯删除接口中的客户端启动方式,导致现在所有下载了(实现接口)lol的电脑,都必须下载一个Wegame才能启动游戏。结论:如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动,这个接口下的类都会被接口辐射扩散影响。