前置知识
- 了解面向对象语言
- 理解面向对象三大特性
前言
我们知道,在 Java
中可以使用抽象类或者使用接口来定义抽象方法,继而让继承或者实现它们的类来实现对于的抽象方法。这是抽象在 Java
当中最典型的表现形式。但是抽象作为 面向对象 语言中如此重要的特性,我们应该对其有更加深刻的了解,才能让我们对其使用得更加游刃有余。
下面,我们可以通过问题的形式来加深我们对抽象这一概念的理解。
关于抽象的问题
关于抽象问题,主要回答以下几个问题。
抽象类和接口的区别?
由于抽象类和接口有如下特性
- 抽象类三大特性(is-a,继承关系)
- 抽象类不允许被实例化
- 抽象类可以包含属性和方法
- 子类继承抽象类,必须实现所有抽象方法
- 接口三大特性(ha-a,协议关系) [jdk8以下]
- 接口不能包含属性
- 接口不能包含代码实现
- 类实现接口,必须实现所有抽象方法
- 那么,两者的区别就是
抽象类可以包含属性和方法,其不能实例化,其功能主要是供子类复用。
接口不能包含属性和被实现的方法,其功能主要是作为一种协议。
抽象和接口能实现哪些编程问题,有何意义
- 抽象类
- 优雅的解决代码复用问题
- 优雅的解决多态问题
- 接口
- 解耦,隔离接口和具体的实现
- 抽象为协议
- 提高代码的可拓展性
如何模拟接口和抽象类
事实上,在允许继承的普通的代码中。我们定义我们的类满足他们自身的三大特性,即可模拟接口和抽象类了
例如,我们需要模拟接口的时候
我们只需要编写一个正常的类,定义好方法,在方法里面默认实现为抛出异常即可
这样子就满足了接口的三大特性,我们继承该自定义接口类之后,必须要重写对应的方法,否则调用的时候会抛出异常。
使用抽象类或者接口的不同时机
我们需要看待解决的问题
- 解决代码复用问题。使用抽象类
- 解决抽象问题,使用接口
为什么基于接口而非实现编程
在软件开发中,最大的挑战之一就是需求的不断变化,这也是考验代码设计好坏的一个标准。
越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性,越能应对未来的需求变化。好的代码设计,不仅能应对当下的需求,而且在将来需求发生变化的时候,仍然能够在不破坏原有代码设计的情况下灵活应对。
而抽象就是提高代码扩展性、灵活性、可维护性最有效的手段之一。
基于接口编程其实就是 基于抽象编程 。对于不稳定(很可能会修改)的系统,我们就要关注可维护性和可拓展性,就要思考其抽象化。