# 实现一个接口

要声明一个实现接口的类,可以在类声明中包含一个 implements 子句。您的类可以实现多个接口,因此 implements 关键字后跟由类实现的接口的逗号分隔列表。按照惯例,implements 声明在 extends 声明之后,如果有的话。

# 一个例子

考虑一个定义如何比较对象大小的接口

public interface Relatable {

    // 返回 1,0,-1
    // 大于,等于,小于
    public int isLargerThan(Relatable other);
}
1
2
3
4
5
6

如果你想能够比较类似对象的大小,不管它们是什么,实例化它们的类都应该实现 Relatable。

Relatable 如果有某种方法可以比较从类实例化的对象的相对「大小」,任何类都可以实现。对于字符串,可能是字符数量; 对于书籍,可能是页数; 对学生来说,这可能是重量; 等等。对于平面几何对象,面积将是一个不错的选择(请参见下面的 RectanglePlus 类),而体积可以用于三维几何对象。所有这些类都可以实现该 isLargerThan() 方法。

如果你知道一个类实现 Relatable,那么你知道你可以比较从这个类实例化的对象的大小。

# 实现 Relatable 接口

下面是创建对象部分中 Rectangle 提供的类 ,重写后实现 Relatable






































 









public class RectanglePlus implements Relatable {
    public int width = 0;
    public int height = 0;
    public Point origin;

    // four constructors
    public RectanglePlus() {
        origin = new Point(0, 0);
    }
    public RectanglePlus(Point p) {
        origin = p;
    }
    public RectanglePlus(int w, int h) {
        origin = new Point(0, 0);
        width = w;
        height = h;
    }
    public RectanglePlus(Point p, int w, int h) {
        origin = p;
        width = w;
        height = h;
    }

    // a method for moving the rectangle
    public void move(int x, int y) {
        origin.x = x;
        origin.y = y;
    }

    // a method for computing
    // the area of the rectangle
    public int getArea() {
        return width * height;
    }

    // 实现比较接口
    public int isLargerThan(Relatable other) {
        RectanglePlus otherRect = (RectanglePlus)other;
        if (this.getArea() < otherRect.getArea())
            return -1;
        else if (this.getArea() > otherRect.getArea())
            return 1;
        else
            return 0;               
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

由于 RectanglePlus 实现了 Relatable,任何两个 RectanglePlus 对象的大小可以比较。

TIP

isLargerTha 在 Relatable 接口中定义的方法需要一个 Relatable 类型的对象。在前面的例子中高亮显示的代码行转换 other 为 RectanglePlus 实例。类型转换告诉编译器该对象究竟是什么。如果直接调用 other 实例的 getArea (other.getArea())将无法编译,因为编译器不明白 other 实际上是一个 RectanglePlus 实例。