特性
抽象类
包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
接口
- 接口成员变量默认为
public static final
,必须赋初值,不能被修改 - JDK1.8中对接口增加了新的特性:
- (1)、默认方法(
default method
):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法; - (2)、静态方法(
static method
):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)
抽象类和接口的区别
- 接口强调特定功能的实现,而抽象类强调所属关系
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | jdk1.8之后通过default提供方法默认实现 |
构造器 | 抽象类可以有构造器,提供给子类super调用 | 接口没有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法,且可以运行抽象类main方法 | 接口没有main方法 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 1.8提供default,则无需修改 |
设计理念 | is-a的关系,体现的是一种关系的延续 | like-a体现的是一种功能的扩展关系 |