一、前文摘要:
好看的皮囊千篇一律,有趣的灵魂万里挑一。我再来炒一份接口的冷饭,客官香吗?
本篇博客的主要内容简介如下:
- 接口与抽象类的区别
- 二者的优缺点,还有组合-抽象骨架类
- 为后代设计接口-包含JDK 1.8的新特性,如default 方法
- 接口仅用来定义类型(java常量安置:常量接口模式,枚举类,不可变实例类)
二、主要内容
1、谈谈接口和抽象类有什么区别?
接口和抽象类是Java面向对象设计的两个基础机制。
接口(Interface)是对行为的抽象,它是抽象方法的集合,利用接口可以达到API定义和实现分离的目的。接口不能实例化;不能包含任何非常量成员,任何field都是隐含着public static final的意义;同时没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法(Java 8)。Java 标准库中,定义了非常多的接口。比如java.util.list。
抽象类(abstract class)是不能实例化的类,用abstract 关键字修饰class,其目的主要是代码重用。除了不能实例化,形式上和一般的java类没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关Java类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java标准库中,比如collection框架,很多通用部分就被抽取成抽象类,例如java.util.AbstractList。
Java 类实现 interface 使用 implements关键词,继承abstract class 则是使用extends关键词。
接口 | 抽象类 | |
---|---|---|
实例化 | no | no |
常量成员 | yes | yes |
非常量成员 | no | yes |
抽象方法个数 | ≥0 | ≥0 |
构造方法 | no | yes |
静态方法实现 | java 1.8以后有 | yes |
普通方法 | no | yes |
多继承 | yes | no |
修饰符 | public | public,protected,default |
抽象方法比接口速度要快,接口需要时间去寻找在类中的实现方法
ps:抽象方法是亲生的,接口是后娘养的
如果往抽象类中添加新的方法,你可以额外给它提供默认的实现,因此你不需要改变子类中的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。
2、二者的结合-骨架实现类
关于二者的优缺点,第一节有讲述过。相信大家还有印象,这里也就不在重述。
在effect java 一书中明确的表明接口是优于抽象类的。但是在实际开发过程中,只是单一使用接口往往是不够的。但是我们可以提供一个抽象的骨架实现类(abstract skeletal implementation class)来与接口一起使用,将接口和抽象类的优点接口起来。接口定义了类型,可能提供了一些默认的方法,而骨架实现类在原始接口方法的顶层实现了剩余的非原始接口方法。继承骨架实现需要大部分的工作来实现一个接口。这就是模板方法设计模式
按照惯例,骨架实现类被称为 AbstractInterface ,其中 I