本文是自学期间查看资料所写,也是看了很多做的总结,能力有限,如果出现错误,希望大家指正,谢谢。
一、什么是抽象类
抽象类顾名思义是之抽象出来的类,具有多个类的共性,是抽象的。抽象类和具体类是相对的概念。“抽象”是一种存在思想逻辑中的概念,而“具体”是一种可见可触摸的现实对象。简单说,法拉利,保时捷,兰博基尼,布加迪等多种车子,可以抽象出车,也可以抽象出跑车,这就是抽象出来的类别,称为抽象类。
抽象类的设计目的是代码复用
在抽象类中是先有子类再有父类,将子类的共性抽取成父类。所以抽象类有一个特性:
有抽象方法必须被声明为抽象类,而抽象类不一定有抽象方法。
抽象是对类本质的抽象,表达的是is a的关系,抽象类包含并实现子类的通用特性,将子类存在的差异化的特性进行抽象,交给子类去实现。
二、什么是接口
接口的设计目的是对行为的约束。
接口可以强制要求不同的类具有相同的行为,他只约束了行为的有无,并不对行为是如何实现的进行约束。简单说,你实现了这个接口,接口里面的东西你必须要有,你怎么用是你的问题,但你也必须要用。
接口是对行为的抽象,表达的是like a的关系,接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁,如何实现,接口不关心。
三、使用场景
当你关注事物的本质时,就需要对事物进行区分,分析异同点,就可以将部分事物的共性抽象出来,就需要使用抽象类!
当你关注一个操作的时候,和事物没有关系,就需要使用接口!
四、接口和抽象类的相同点
- 抽象类和接口都不能实例化,但可以定义抽象类和接口类的引用。
- 一个类如果继承了某个抽象类,或实现了某个接口,都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
五、接口和抽象类的不同点
- 抽象程度不同: 接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法。接口中不能定义构造器,而且其中的方法全部是抽象方法。
- 权限修饰符不同: 抽象类中的成员可以是private、default、protected和public的。接口中的成员全是public的。
- 成员变量的定义范围不同: 抽象类可以定义成员变量,接口中定义的成员变量都是常量。
- 成员变量的自由程度不同: 接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;
- 功能不同: 抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
- 抽象类的设计目的是代码复用,接口的设计是对行为的约束。
- 抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
- 单继承,extends。多实现,implements。
六、应用
- 抽象类的功能相比较多于接口,但定义抽象类的代价高。
- 高级语言中,只能实现单继承。在这个类中,你必须继承或编写出其所有子类的所有共性。
- 接口虽然在功能上会弱化许多,但是它只是针对一个动作的描述,但可以在一个类中同时实现多个接口。
- 抽象类的设计目的是代码复用,接口的设计是对行为的约束。