抽象类和接口煮鸡蛋说

仅能继承单个父类;可以实现多个接口。这是Java实现其多态性的重要手段,也涵盖了接口、抽象类和类之间的关系

接口的属性有字段和方法组成,没有构造函数的原因:接口是用来被子类继承实现多态性的,是不能被实例化的

相同点

A. 两者都是抽象类,都不能实例化。

B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

不同点

A. interface需要实现,要用implements,而abstract class需要继承,要用extends。

B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。

C. interface强调特定功能的实现,而abstract class强调所属关系。

D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

这个选择有两点含义:

一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。

二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也 不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接 口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。

abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己 的实例变量,以供子类通过继承来使用。

 

 

 接口是implements,一个类可以实现多个接口,并且要实现接口里的所有抽象方法。这样,接口就有了一个天生的短板,那就是当多个类实现同一个接口时,如果有共同的操作,那么怎么封装,接口里面是不能有实例方法的。比如说,有接口A ,类B1、类B2和类B3实现A,但是B1、B2和B3里面都有一个共同的操作,就比如是查询所有用户保存到一个map中,然后判断当前新增的用户是否存在map中,我们是不能把这个方法写在接口A里面的,因为接口A不能有实例方法。那么要么我们在B1、B2、B3中都写这个方法,但是这种做法明显不符合代码重用的规则。正确的做法是,另写一个抽象类C ,将查询数据写在C中,然后让 B1、B2和B3实现A的同时继承C。B1 extends C implements A 这样就做到了封装。

        抽象类可以多重继承,接口也可以多重实现,但是抽象类可以将具体的方法做成封装,这样就扩张了程序的功能。
--------------------- 
作者:xinqing5130 
来源:CSDN 
原文:https://blog.csdn.net/xinqing5130/article/details/72844273 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

什么是抽象类?——抽象类中可以有抽象方法

什么是抽象方法?——可以只定义方法,不写方法的实现

一个非抽象类继承抽象类必须要实现抽象类的方法,一个抽象类继承抽象类可以实现抽象方法也可以不实现

什么是接口?——只定义方法,不写方法的实现

一个接口可以继承另一个接口,一个类可以实现一个接口(类实现接口时,必须要实现接口的方法)

抽象类和接口的方法类似,为什么有了抽象类还需要接口呢?

因为一个类一次只能继承一个类,不能同时继承多个类 ,但是一个类可以同时实现多个接口或者一个接口可以同时继承多个接口

eg : class A extends B,C  —— 这是不允许的

eg : class A  implements B,C,D ——这是允许的

eg: interface A extends B,C,D —— 这也是允许的
--------------------- 
作者:lanju2012 
来源:CSDN 
原文:https://blog.csdn.net/lanju2012/article/details/53696024 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值