119. Java 接口 - 将接口用作类型

54 阅读4分钟

119. Java 接口 - 将接口用作类型

当我们定义接口时,实际上是在定义一种新的引用数据类型。接口名称可以像任何其他数据类型一样,在代码中被广泛使用。通过将接口作为类型来声明变量,我们可以确保该变量只能引用实现该接口的类的实例。

接口类型的引用变量

接口的一个重要特点是,我们可以将它作为变量的类型,允许在多个类之间共享行为。例如,当我们在类中定义一个方法,该方法接收某种接口类型的对象时,它可以接受所有实现了该接口的对象。为了理解这一点,我们通过一个具体示例来看看如何将接口用作类型。

假设我们有一个 Relatable 接口,定义了一个方法 isLargerThan(),用于比较两个对象的大小。实现该接口的类必须提供这个方法的具体实现。

示例:Relatable 接口

public interface Relatable {
    int isLargerThan(Relatable other);
}

接口 Relatable 的实现类需要具体定义 isLargerThan() 方法,返回一个整数值,表示对象之间的比较结果:

  • 如果 this 大于 other,返回正数。
  • 如果 this 小于 other,返回负数。
  • 如果 this 等于 other,返回零。

使用接口类型的引用变量

现在,我们来编写一个方法,该方法能够接收实现了 Relatable 接口的两个对象,并比较它们,返回其中的较大对象:

public Object findLargest(Object object1, Object object2) {
   Relatable obj1 = (Relatable) object1;
   Relatable obj2 = (Relatable) object2;
   if (obj1.isLargerThan(obj2) > 0)
      return object1;
   else
      return object2;
}

在这个例子中,我们将 object1object2 强制转换为 Relatable 类型,从而可以调用 isLargerThan() 方法。这使得我们能够比较实现了 Relatable 接口的任何两个对象,无论它们属于哪个类,只要它们实现了接口。

进一步扩展:查找最小值和比较相等

同样的方法可以扩展到查找最小对象和比较两个对象是否相等。例如:

public Object findSmallest(Object object1, Object object2) {
   Relatable obj1 = (Relatable) object1;
   Relatable obj2 = (Relatable) object2;
   if (obj1.isLargerThan(obj2) < 0)
      return object1;
   else
      return object2;
}

public boolean isEqual(Object object1, Object object2) {
   Relatable obj1 = (Relatable) object1;
   Relatable obj2 = (Relatable) object2;
   return obj1.isLargerThan(obj2) == 0;
}

这里,我们使用 isLargerThan() 方法来实现查找最小对象和判断两个对象是否相等。因为 Relatable 是一个接口,任何实现了这个接口的对象都可以与 findLargest()findSmallest()isEqual() 方法一起使用。

接口作为类型的优势

通过将接口用作类型,可以实现某种程度的多重继承,即一个类可以继承自一个父类,同时实现多个接口。这样,这些类就能够同时拥有来自父类和接口的行为。

例如,如果我们有一个 Shape 类,它是一个父类,同时有一个 Movable 接口和一个 Resizable 接口,我们可以让 Circle 类既继承 Shape 又实现 MovableResizable,从而获得这些接口的行为:

public class Circle extends Shape implements Movable, Resizable {
    // Circle 具体实现
}

这种方式允许我们将行为从不同的来源组合在一起,充分利用接口的灵活性。

总结

  1. 接口作为类型:接口可以作为类型使用,使得我们可以通过接口来规范对象的行为。通过接口类型声明变量,我们确保只有实现该接口的类的实例才能赋值给这个变量。
  2. 多态性和接口的优势:使用接口作为类型,不仅提供了代码的灵活性,而且增强了多态性。不同类的对象可以共享相同的接口方法,从而在不改变现有代码的情况下扩展功能。
  3. 行为组合(多重继承):接口支持多重继承,允许一个类实现多个接口,从而将来自不同来源的行为结合在一起,增强了类的可扩展性。

接口作为类型是 Java 中非常强大的特性之一,能够帮助我们编写更加通用、灵活和可维护的代码。