前言
总所周知抽象类和接口是Java里面比较重要的俩个对象,在我们的工作学习中都起着很多决定性的作用,在学习Java的时候我们的老师或者课本或者一些权威或许会告诉我们抽象类是什么什么,接口是什么什么,但是你有没有想过你自己在日常的编程当中使用过多少次的抽象类,像常见的MVC架构,业务层我们会去使用一个接口然后一个实现类,如果你写了个抽象类然后一个实现类估计会被骂的狗血临头,像现在使用最多的MyBatis,为什么他是一个接口形式然后对应的mapper文件去映射接口,而不是一个抽象类文件,mapper去映射抽象类。
实现的区别
谈到区别就绕不开目前坊间的一些区别,这里我也不细述,毕竟都知道,贴一张图,别的博客找的
那么问题来了,这是他们具体实现上面的区别,但是他们本质又有什么区别,凭什么MVC架构设计师让我们用接口不用抽象类,凭什么MyBatis设计师让我们用接口不用抽象类。
引用 《计算机科学》 上面的对抽象类的定义:
抽象类被定义为永远不会也不能被实例化为具体的对象。它往往用于定义一种抽象上的概念,在类的继承关系中它往往被定义在较上层的位置。在程序设计的实践活动中,抽象类与接口存在类似的地方,即它更偏重于对共通的方法和属性进行规约。但与接口存在一个非常大的差异则在于,抽象类往往可以规约一个共同的方法和属性时提供一个对他们的实现。
以现实世界为例:“水果”可以算作一个抽象类,而“苹果”、“香蕉”则可以作为它的派生类。区别在于,“水果”是个概念,它不会有实例,但是“苹果”、“香蕉”则肯定会有实例。
那么我们是不是可以认为所有抽象类都是的基层类,而接口就是具体的规则需求,站在面向对象的角度,来看待我们的现实生活,类似于建筑一个房子,你的装修风格,北欧式的日式的,这时候这些设计风格上面统称为实现了抽象类,那具体的怎么去做,每个家具的摆放位置,那就是按照接口去完成。那站在MVC、MyBatis等框架的设计角度来看,房子样式他们已经帮你选好了,你要做的就是摆放家具了。
引申的思考
那么除了这些以外是不是应该还有更本质的一点东西,什么装修风格,什么家具摆放,为什么他们就得是这样。那回到他们的本身,Java许多的东西被设计出来都是有自己独特的设计理念和思考在里面的,也就是我们常说的设计模式,那体现在抽象类和接口上面所对应的具体的设计模式,一个是模板模式一个是策略模式。
模板模式:
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
策略模式:
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
这时候许多东西便可以用这种带点学术性质的东西来描述了,像我们最常见的基类Object,他就是一个很显然易见的模板模式的设计思路,所以他是一个抽象类,而不是接口;像我们最常见的接口List,他会根据你的不同的行为需求,为你提供不同的实现类,这个便是策略模式。
总结
标题起的多少会有一些噱头成分,关于抽象类和接口区别是许多面试经常会被问到的一些东西,每次回答也是千篇一律的答案,但是坐下来细细思考,里面耐人寻味的东西还是比较多的,Java的设计思想是很重要的一种东西,作为一个常年CRUD的开发者,弄明白为什么这东西要这样去写,我觉得还是一件很重要的事情。