java接口和抽象类到底有哪些区别,什么时候该用接口什么时候该用抽象类

相信大家在面试过程中都会被问到这个问题,语法上的区别大家都知道,但是如果面试时你只说语法上的区别估计面试官会在心里扣你两分。
下面说说我在使用过程中关于这两者在设计方面的区别的一些理解:
接口大家比较熟悉一点,因为现在的MVC架构业务层规范就是先写接口再写实现类,接口设计的目的就是定义一组行为规范,其实现类必须实现接口中的所有方法。接口的调用者只关心调用的方法是否满足接口规定的规则,而不关心哪个实现类实现了这个规则,如何实现的。
在使用都是A a=new B(); a....   比如程序调用a对象的test方法时,不用关心到底调用的是B实现类实现的方法还是C实现类实现的方法,只用关心是否满足A接口中定义的test的这个规范即可。
但其实大家可以发现上面说的用抽象类也一样可以完成,那为什么这里不用抽象类而是用接口?到底什么时候应该用抽象类呢?
请设想这样一个应用场景:
我公司打算为后台系统添加一个报表模块,分为订单报表,商品报表,供应商报表等等...
我们简单的认为构造一个excel报表分为构造表头部分以及获取数据两部分,构造表头的逻辑每个报表都一样,不一样的是获取数据部分,
也就是说构造多种报表有共同的部分,也有各不一样的部分。这时候可以用接口实现嘛?当然可以,只不过不同实现类中实现构造表头方法时逻辑都一样,这当然不优雅..
这时候我们就应该想到抽象类:


这样多个子类报表构造器是不是就可以公用继承而来的构造表头逻辑,而只需去实现构造数据的逻辑了、?
可以看出来抽象类是一种模板式设计,定好 一个模板,这里的模板就是builder()方法,这个模板需要调用构造表头和构造数据两个方法才能实现
一个方法可被多个子类继承公用,一个方法需要子类根据自身情况去实现。
总结一下:
接口是定好一组行为规范,每个实现类都要实现所有规范。这叫辐射式设计
抽象类是定好一个模板,模板里有各个实现类可以公用直接继承的方法,子类只需要实现不同的部分即可,当公共部分需要发生变化时只修改抽象类即可。这叫模板式设计。

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/78862533