Java 接口

接口的概念

接口这个概念在生活中并不陌生,电子世界中一个常见的接口就是USB接口。计算机往往有多个USB接口,可以插各种USB设备,如键盘、鼠标、U盘、摄像头、手机等。

接口声明了一组能力,但它自己并没有实现这个能力,它只是一个约定。接口涉及交互两方对象,一方需要实现这个接口,另一方使用这个接口,但双方对象并不直接互相依赖,它们只是通过接口间接交互,如图所示。
Java 接口

拿上面的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 {
    // 主体代码
}

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!