你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

(五)抽象类与接口

2021/12/19 11:35:53

一、定义

【1】抽象类实际上就是类,只不过是一种特殊的类,这种类不能被实例化为对象,只能被子类继承;继承关系是一种 is-a 的关系,那抽象类既然属于类,也表示一种 is-a 的关系。

【2】接口泛指供别人调用的方法或者函数,接口表示一种 has-a 关系,表示具有某些功能。对于接口,有一个更加形象的叫法,那就是协议(contract)

【3】从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)

【4】而接口正好相反,它是一种自上而下的设计思路。我们在编程的时候,一般都是先设计接口,再去考虑具体的实现

二、区别

2.1、相同点

【1】都不能被实例化

【2】接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化

【3】都可以用于实现面向对象的多态性,提高代码的扩展性

2.2、不同点

2.2.1、语法层面

【1】一个类只能继承一个抽象类,而一个类却可以实现多个接口

【2】接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法

【3】抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法,无实现细节;(java 1.8之后,接口也可以了)

【4】抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的

2.2.2、抽象层面

【1】抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象

【2】抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象

【3】设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计

三、作用

抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础

3.1、抽象类

【1】抽象类不能实例化,只能被继承,继承能解决代码复用的问题。所以,抽象类也是为代码复用而生的

【2】普通类也能进行继承并实现代码复用,但是为啥要用抽象类呢?
原因:一般要进行继承,那么父类肯定是有一个要子类进行实现的方法,对于普通类来说可以定义一个空方法来达到抽象类中的抽象方法;但是这样的定义,会影响代码的可读性,也影响设计美感;为什么会说影响可读性呢?因为父类中定义了一个空方法,当注释不给力的时候,我们就不知道为什么这样去设计了,而且,这种设计也违反了设计原则中的里氏替换原则;再者当父类有很多的方法的时候,子类有可能会遗忘实现父类的方法,但是如果是抽象类,编译器会进行提示

3.2、接口

【1】抽象类更多的是为了代码复用,而接口就更侧重于解耦(解耦约定与实现)

【2】接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码的可扩展性

【3】“基于接口而非实现编程”,就是一条几乎天天会用到,并且能极大地提高代码的灵活性、扩展性的设计思想

四、抽象类和接口的选择

【1】如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类

【2】如果我们要表示 一种 has-a 关系(有某种行为或者功能),并且是为了解决抽象而非代码复用的问题,那我们就可以使用接口

五、"基于接口而非实现编程"原则

【1】基于接口而非实现编程。这个原则非常重要,是一种非常有效的提高代码质量的手段,在平时的开发中特别经常被用到;这条原则还很容易被过度应用,比如为每一个实现类都定义对应的接口

【2】