接口和抽象类

20年的秋招要来了,正值面试的大好时节,我想更新一下这个系列,帮助小伙伴拿到面试机会
(但不确定能否坚持下去...小声BB)

接口和抽象类的区别

我看了网上很多资料,感觉都没有讲到点上,纯粹是应试教育死记硬背的答案,一点都不通俗!

接口抽象级别更高?
面试官问:为什么?怎么理解抽象级别?
你就傻了。

1. 能否写方法的具体实现

接口只能写抽象方法,不能写具体实现,而抽象类可以

比如我们写一个People的抽象类

public abstract class People{
    public void breath() {
        //我可以用肺呼吸,这个是肯定的
        System.out.println("I can breath with my lung");
    }

    public abstract void speak();
}

这里我们写了两个方法,一个breath,表示呼吸,一个是speak,表示说话。
breath这个方法是明确的,是人都是用肺呼吸,这毋庸置疑(说死人没法呼吸,鱼人用鳃呼吸的stop)。
但是speak就不确定了,说什么话,怎么说话,甚至有人是哑巴,声带坏了,就没法说话了,这不够确定,所以我们,要把它写成抽象方法,等子类实现。

这里我们注意到,抽象类(abstract class)是可以写方法的具体实现的

而如果我们换用接口来实现这个People就是不合适了,因为很多我们确定的方法无法实现,如果要实现,还要继续写一个AbstractPeople 抽象类

abstract class AbstractPeople implements People

这样大家可能就想起来了List的很多集成关系

你们看,所有的高质量代码,在抽象类(abstract class)里面绝对会有具体的方法实现。

而interface的目的是更抽象的表达一个即将或者可能会生成的对象的一些基本方法

因此我们就发现了抽象类和接口最大的区别了。

你回答完这一部分,伴随着你举的例子,基本面试官已经为你点头了。

2.单继承导致的使用习惯

接口和抽象类有一些使用习惯的或者规则上的不同。

抽象类用的地方相对于接口来说,是比较少的

接口还有一个很大的用处是——专门将类的功能抽象

像 Serializable Cloneable 等

这些都是接口干的活

因为接口来抽像一个功能,可以保证一个类在功能上的扩展性,添加一个功能,只需要多实现一个接口就可以

而如果继承抽象类, 由于Java是单继承的 就只能改抽象类里面的代码,增加成员变量或者成员函数之类的,对代码修改太大,是极其不推荐!!!

而且,很多时候有些代码你没法改,你可能只有Only-read权限,所以接口担此重任毋庸置疑!!!

3.结语

看完本篇文章,相信已经可以对接口抽象类的问题应对自如了。
这是我对接口和抽象类的个人理解。
有不对或者遗漏的欢迎各位大佬指正补充。

posted @ 2020-09-01 17:22  想植发先秃头  阅读(143)  评论(0编辑  收藏  举报