Java 8 改进的接口
接口是一种抽象的更彻底的抽象类,接口里的所有方法都是抽象方法。
本文包含如下:
- 接口的概念
- Java 8 中接口的定义
- 接口的继承
- 使用接口
- 接口和抽象类
- 面向接口编程
1. 接口的概念
可见,接口是从多个相似类中抽象出来的规范,不停任何实现。接口体现的是规范和实现分离的设计哲学。
接口的好处:
软件系统的各模块也应该采用这种面向接口的耦合,降低各模块之间的耦合,为系统提供更好的可扩展性和维护性。
接口里通常是定义一组公用方法。
2. Java 8中接口的定义
定义接口形式如下:
在上面的语法中:
接口里所含的内容说明:
接口的访问控制修饰符说明:
对于接口定义的静态常量;
接口的定义的方法:
接口定义的内部类、内部接口、内部枚举类:
下面定义一个接口:
接口里的成员变量默认是使用 public static final 修饰的,因此即使另一个类处于不同包下,也可以通过接口来访问接口里的成员变量。如下面程序:
在上面程序中:
3. 接口的继承
接口的继承支持多继承,即一个接口可以有多个直接父接口。
子接口继承父接口,将会获得父接口里定义的所有抽象方法、常量。
4,使用接口
接口的用途:
实现接口和继承父类相似,一样可以获得所实现接口里定义的常量(成员变量)、方法(包括抽象方法和默认方法)
以下展示一个实现接口的类:
在上面的程序中:
Printer 类实现了 Output 接口和 Product 接口,因此 Printer 对象既可以赋给 Output 变量,也可以赋给 Product 变量。仿佛 Printer 类既是 Output 类的子类,也是 Product 类的子类,也就是Java 提供的模拟多继承。
实现接口方法时,必须使用 public 修饰符
5. 接口和抽象类
接口和抽象类都具有如下特征:
接口和抽象类的差别:
在接口类中:
而对于抽象类:
除此之外,这两者在用法上存在如下区别:
6. 面向接口编程
面向接口可以降低耦合。以下介绍两个应用场景:
1.简单工厂模式
上面的 Computer 类已经完全与 Printer 类分类,只是与 Output 接口耦合。Computer 不再负责创建 Output 对象,系统提供一个Output 工厂来负责生成 Output 对象,这个 OutputFactory 工厂代码如下:
下面是BetterPrinter 实现类的代码,BetterPrinter 只是对原有的Printer 进行简单修改,以模拟系统重构后的改进。
上面的 BetterPrinter 类也出现了 Output 接口,因此也可被当成 Output 对象使用,于是只要把 OutputFactory 工厂类的 getOutput() 方法中粗体字代码改为如下代码:
return new BetterPrinter();
再次运行前面的 OutputFactory.java 程序,发现系统运行时已经改成 BetterPrinter 对象,而不是原来的 Printer 对象。
对于设计模式的理解:
2. 命令模式
考虑这种场景:某个方法需要完成一种行为,但这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。
这个方法不仅需要普通数据可以发生变化,执行方法体可能也需要发生变化,难道把“处理行为”作为参数传进来?
上面的 Command 接口里定义了一个 process() 方法,这个方法用于封装“处理行为”;但是不确定其处理行为。
下面程序示范了对数组的两种方式:
运行上面程序,最后输出结果如下图所示: