用了接口还有必要用抽象类吗?

前言

关于接口与实现类的区别,相信大家都能说出一二三来,但小编在这还是总结一下。


接口与抽象类

1、二者表达概念不同,接口是为所有实现类定义的统一行为规范,实现类的行为需要按照接口中的规范去做。而抽象类是一类事务的高度聚合,对于继承抽象类的子类来说,与抽象类是 "is a"的关系。

2、抽象类在定义方法时,根据子类的一致行为,可以给出方法的实现,也可以不给出;而接口,其中定义的方法都不能给出实现部分。

3、继承/实现 对于两者所涉及的实现是不同的。继承抽象类的子类,可以不用进行重写,延用抽象类的方法,让其子类去实现。而对于接口来说,它的实现类必须给出相应的方法实现。

4、在抽象类中新增方法的话,其子类可以不用做任何改动,而在接口中新增方法,子类全部都要给出方法的实现。这也是为什么说接口是规范的意思。

5、接口可以多实现,而抽象类只能单继承。所以,使用接口可以实现间接的多重继承。

6、接口成员变量默认为:

public static final

并且必须赋初值,因为用 final 修饰,所以不能被修改。

而抽象类中成员变量默认为:

default

用了接口还有必要用抽象类吗?

在接口和实现类中有必要使用抽象类吗?增加了抽象类有什么好处呢?

让抽象类去实现接口,而不是每个实现类去实现接口,实现类一致的行为(或者说大部分一致的行为)在抽象类中进行实现,而不一致的行为(或者一小部分不一致的行为),在抽象类中写成抽象方法,让子类去重写,减少子类重写接口所有方法的负担。

使用抽象类前
(使用抽象类前)

使用抽象类后
在这里插入图片描述

小结

上文中例子,抽象类的作用是将子类一致的行为(flying)抽象出来,放到抽象类中,而不是各子类去实现,让子类复用抽象父类中的方法。

以上只是小编的一些想法,如有更好的观点,欢迎交流。

猜你喜欢

转载自blog.csdn.net/weixin_42653522/article/details/109542624