一、抽象类
在Java中我们把被abstract字段修饰的方法称为抽象方法,把被abstract修饰的类称为抽象类。含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法。抽象类的特点有以下几点:
- 抽象类不能被实例化
- 一个类继承一个抽象类,必须重写其中的抽象方法,除非这个类也是一个抽象类
- 抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用
- 抽象类中的抽象方法不能是private,JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default
为什么要有抽象类
- 用于类型隐藏,在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类
- 用于拓展对象的行为功能这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能
二、接口
接口使用interface修饰,接口不同于类,不能被继承,而是使用implements来实现一个接口。接口就是比抽象类更抽象的一种结构。它有以下几个特点:
- 一个类可以实现多个接口,接口也可以继承接口,弥补了Java不能多继承的缺点
- 接口中的成员变量默认是public static final的,方法默认是public abstract的
- JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)
三、抽象类和接口的区别
相同点
- 都不能被实例化
不同点
- 接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现
- 实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承
- 接口强调特定功能的实现,而抽象类强调所属关系
- 接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号