抽象类:被abstract
关键字修饰的类叫做抽象类
- 抽象类不能被实例化,只能被
继承
- 包含抽象方法的一定是
抽象类
,但抽象类不一定含有抽象方法
- 抽象类中的
抽象方法
的修饰符只能是public
或protected
,默认为public
- 子类继承
抽象类
必须实现所有父类声明的抽象方法
,否则子类也是一个抽象类
,必须被abstract
关键字修饰- 抽象类可以含有
属性、方法、构造方法
,但构造方法
不能用于实例化对象
,主要用于被子类调用做一些初始化工作
接口:接口使用interface
关键字声明,接口不是一种类,而是对类的一组需求描述
- 接口不能被实例化,只能被实现
- 接口中不含有
非抽象方法
(Java 8 后可以非抽象默认方法
)- 接口中只能声明公共常量 默认且只有
public static final
修饰- 接口只能继承接口,且可以继承一个或多个接口
- 一个类实现接口必须实现接口所有的抽象方法,否则这个类也是一个
抽象类
区别:
两个方面:
- 语法层面上的区别
- 抽象类中可以有方法实现,而接口中只能存在抽象方法(
java 8
后新增默认风法);- 抽象类中的成员变量可以是各种类型的,而接口中的只有公共静态常量
public static final
;- 接口中不能含有
静态代码块
以及静态方法
,而抽象类可以有静态代码块
和静态方法
;- 一个类只能
继承
一个抽象类,而一个类却可以实现
多个接口。- 抽象类也可以实现接口,接口只能继承接口
- 设计层面上:
- 抽象类是对一种事物的抽象,即对
类
的抽象,而接口是对行为
的抽象,抽象类是对类的整体进行抽象,包括类的属性、行为
,而接口是对类的局部行为进行抽象- 个人理解:抽象类是将一部分共同的属性和行为,抽象成一个整体,这一个整体下的个体必定具备一部分相同的属性和行为,只在单个个体下有一定差异,例如:动物是一个大类,人和熊都有四肢、内脏属性以及吃饭、睡觉的行为,但是,人吃熟肉,熊吃生肉,在吃饭这一行为的具体实施上就有所差异。而接口就是将一些事物共有的行为抽取出来,不同的对象对该行为都有不同的解释。
- 简单点说,抽象类就是对一类
类
的抽象,而接口则是一个或一类
类应当具有的方法- 抽象类作为很多类的父类,是一种模板式设计,而接口则是一种行为规范,属于辐射式设计。