接口的概念
接口这个概念在生活中并不陌生,电子世界中一个常见的接口就是USB接口。计算机往往有多个USB接口,可以插各种USB设备,如键盘、鼠标、U盘、摄像头、手机等。
接口声明了一组能力,但它自己并没有实现这个能力,它只是一个约定。接口涉及交互两方对象,一方需要实现这个接口,另一方使用这个接口,但双方对象并不直接互相依赖,它们只是通过接口间接交互,如图所示。
拿上面的USB接口来说,USB协议约定了USB设备需要实现的能力,每个USB设备都需要实现这些能力,计算机使用USB协议与USB设备交互,计算机和USB设备互不依赖,但可以通过USB接口相互交互。
定义接口
我们通过一个例子来说明Java中接口的概念。这个例子是“比较”,很多对象都可以比较,对于求最大值、求最小值、排序的程序而言,它们其实并不关心对象的类型是什么,只要对象可以比较就可以了,或者说,它们关心的是对象有没有可比较的能力。Java API中提供了Comparable接口,以表示可比较的能力,但它使用了泛型,而我们还没有介绍泛型,所以本文先自己定义一个Comparable接口,叫MyComparable。
首先来定义这个接口,代码如下:
public interface MyComparable {
int compareTo(Object other);
}
定义接口的代码解释如下:
- Java使用interface这个关键字来声明接口,修饰符一般都是public。
- interface后面就是接口的名字MyComparable。
- 接口定义里面,声明了一个方法compareTo,但没有定义方法体,Java 8之前,接口内不能实现方法。接口方法不需要加修饰符,加与不加相当于都是public abstract。
再来解释compareTo方法:
- 方法的参数是一个Object类型的变量other,表示另一个参与比较的对象。
- 第一个参与比较的对象是自己。
- 返回结果是int类型,-1表示自己小于参数对象,0表示相同,1表示大于参数对象。
接口与类不同,它的方法没有实现代码。定义一个接口本身并没有做什么,也没有太大的用处,它还需要至少两个参与者:一个需要实现接口,另一个使用接口。我们先来实现接口。
实现接口
类可以实现接口,表示类的对象具有接口所表示的能力。在此以前面介绍过的Point类来说明。我们让Point具备可以比较的能力,Point之间怎么比较呢?我们假设按照与原点的距离进行比较,Point类代码如代码清单如下所示。
// www.coolcou.com
public class Point implements MyComparable{
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public double distance(){
return Math.sqrt(x*x+y*y);
}
@Override
public int compareTo(Object other) {
if(! (other instanceof Point)){
throw new IllegalArgumentException();
}
Point otherPoint = (Point)other;
double delta = distance() - otherPoint.distance();
if(delta<0){
return -1;
}else if(delta>0){
return 1;
}else{
return 0;
}
}
@Override
public String toString() {
return "("+x+", "+y+")";
}
}
代码解释如下:
- Java使用implements这个关键字表示实现接口,前面是类名,后面是接口名。
- 实现接口必须要实现接口中声明的方法,Point实现了compareTo方法。
再来解释Point的compareTo实现。
- Point不能与其他类型的对象进行比较,它首先检查要比较的对象是否是Point类型,如果不是,使用throw抛出一个异常,异常将在下一章介绍,此处可以忽略。
- 如果是Point类型,则使用强制类型转换将Object类型的参数other转换为Point类型的参数otherPoint。
- 这种显式的类型检查和强制转换是可以使用泛型机制避免的。
一个类可以实现多个接口,表明类的对象具备多种能力,各个接口之间以逗号分隔,语法如下所示:
public class Test implements Interface1, Interface2 {
// 主体代码
}
酷客教程相关文章:
评论前必须登录!
注册