114. Java 接口 - 定义接口及其实现

48 阅读4分钟

114. Java 接口 - 定义接口及其实现

接口声明:Relatable

Java 中,接口用来定义类之间的一种通用“契约”,即规定类必须提供特定的方法。接口并不提供方法实现,而是声明方法的签名,并且规定哪些方法必须由实现该接口的类来实现。

我们可以定义一个接口 Relatable,它允许我们比较两个对象的大小。在这种情况下,接口会提供一个方法 isLargerThan(),该方法用于比较两个对象的相对大小。

public interface Relatable {

    // 用于比较两个对象的大小
    // 如果当前对象大于其他对象,则返回 1
    // 如果当前对象等于其他对象,则返回 0
    // 如果当前对象小于其他对象,则返回 -1
    public int isLargerThan(Relatable other);
}

在这个接口中,isLargerThan() 方法的参数是另一个实现了 Relatable 接口的对象。返回值的规则如下:

  • 返回 1 表示当前对象比参数对象大。
  • 返回 0 表示当前对象和参数对象相等。
  • 返回 -1 表示当前对象比参数对象小。

接口应用

如果我们希望能够比较不同类实例的“相对大小”,任何实现了 Relatable 接口的类都可以使用 isLargerThan() 方法。例如,比较两个矩形的面积,比较两个学生的体重,或者比较两个书本的页数等。只要这些类实现了 Relatable 接口,我们就能够比较它们的大小。

Relatable 接口的实现:RectanglePlus

以下是实现了 Relatable 接口的 RectanglePlus 类,它表示一个矩形,并可以与其他矩形进行比较大小。矩形的“大小”由它的面积决定。

public class RectanglePlus implements Relatable {

    public int width = 0; // 矩形的宽度
    public int height = 0; // 矩形的高度
    public Point origin; // 矩形的原点

    // 四个构造方法
    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;
    }

    // 移动矩形的位置
    public void move(int x, int y) {
        origin.x = x;
        origin.y = y;
    }

    // 计算矩形的面积
    public int getArea() {
        return width * height;
    }

    // 实现 Relatable 接口的 isLargerThan() 方法
    @Override
    public int isLargerThan(Relatable other) {
        // 强制类型转换,将 other 转换为 RectanglePlus 类型
        RectanglePlus otherRect = (RectanglePlus) other;

        // 比较当前矩形与其他矩形的面积
        if (this.getArea() < otherRect.getArea()) {
            return -1; // 当前矩形小
        } else if (this.getArea() > otherRect.getArea()) {
            return 1; // 当前矩形大
        } else {
            return 0; // 两个矩形的面积相等
        }
    }
}

解释

  1. 构造方法RectanglePlus 类有多个构造方法,用于创建不同的矩形实例。我们可以根据需要设置矩形的宽度、高度或原点位置。

  2. move() 方法move() 方法可以移动矩形的位置,改变原点坐标。

  3. getArea() 方法getArea() 方法返回矩形的面积,计算公式为:宽度 * 高度

  4. isLargerThan() 方法: 该方法是 Relatable 接口要求实现的方法。它用于比较当前矩形与另一个矩形的面积,返回值根据面积大小来决定:

    • 返回 -1 表示当前矩形的面积小于另一个矩形。
    • 返回 1 表示当前矩形的面积大于另一个矩形。
    • 返回 0 表示两个矩形的面积相等。

    注意: isLargerThan() 方法接收的参数是 Relatable 类型的对象,但我们必须将该对象强制转换为 RectanglePlus 类型,因为我们知道传入的对象实际上是一个 RectanglePlus 实例。这是 Java 中常见的类型转换方式,允许我们使用 RectanglePlus 特有的 getArea() 方法。

使用 RectanglePlus

由于 RectanglePlus 实现了 Relatable 接口,因此我们可以通过 isLargerThan() 方法来比较任意两个 RectanglePlus 对象的大小。

public class TestRectangle {
    public static void main(String[] args) {
        // 创建两个矩形
        RectanglePlus rect1 = new RectanglePlus(5, 10); // 5x10 的矩形
        RectanglePlus rect2 = new RectanglePlus(6, 8);  // 6x8 的矩形

        // 比较两个矩形的大小
        int result = rect1.isLargerThan(rect2);

        if (result == 1) {
            System.out.println("rect1 大于 rect2");
        } else if (result == 0) {
            System.out.println("rect1 等于 rect2");
        } else {
            System.out.println("rect1 小于 rect2");
        }
    }
}

输出:

rect1 小于 rect2

在这个例子中,我们创建了两个 RectanglePlus 对象 rect1rect2,分别表示 5x10 和 6x8 的矩形。通过 isLargerThan() 方法比较两个矩形的面积,输出结果为“rect1 小于 rect2”。

总结

  • 接口 Relatable 允许我们定义一种标准,用于比较不同类对象的“相对大小”。
  • 任何类只要实现了 Relatable 接口,就能够比较该类的对象与其他同类型对象的大小。
  • 在实现 Relatable 接口时,我们需要提供 isLargerThan() 方法的具体实现,这个方法接收一个 Relatable 类型的对象并返回比较结果。
  • 通过这种方式,我们能够实现灵活的对象比较,增强代码的可扩展性和重用性。