113. Java 接口

51 阅读5分钟

113. Java 接口

Java 中的接口

在软件工程中,不同的团队或开发者经常需要达成一个“合同”来定义他们的软件如何进行交互。这个“合同”允许每个团队在不知道对方具体实现的情况下独立编写代码。在 Java 中,接口就是这种“合同”。

例如,想象一个未来的社会,机器人汽车被用来运送乘客穿越城市街道,而不需要人工操作。汽车制造商编写了控制汽车的程序(比如:启动、加速、转弯等),而另一个团队负责制造 GPS 和交通监控系统,该系统会根据地理位置和交通状况控制汽车行驶。

为了让这两个团队的软件能够交互,汽车制造商定义了一个行业标准的接口,规定了可以控制汽车的方法(例如:启动、转弯等)。这样,GPS 和交通系统制造商只需要遵守这个接口,就能够控制任何厂商制造的汽车,而无需关心其具体实现。接口定义了双方交互的“契约”。

接口的定义

接口在 Java 中是一种引用类型,它只能包含常量、方法签名、默认方法、静态方法、实例非抽象方法(这些方法通常是私有的或未公开的)以及嵌套类型。接口不能直接实例化,类需要实现接口,或者其他接口可以扩展它。接口的方法体只在默认方法、静态方法和私有方法中存在。

接口的声明格式如下:

public interface OperateCar {

   // 常量声明 (如果有)
   int MAX_SPEED = 150;

   // 方法签名
   int turn(Direction direction, double radius, double startSpeed, double endSpeed);
   int changeLanes(Direction direction, double startSpeed, double endSpeed);
   int signalTurn(Direction direction, boolean signalOn);
   int getRadarFront(double distanceToCar, double speedOfCar);
   int getRadarRear(double distanceToCar, double speedOfCar);
   // 更多方法签名...
}

注意,接口中的方法签名没有大括号,并且以分号结尾。

实现接口

要使用接口,需要编写一个类来实现它。一个类实现接口时,必须为接口中声明的每个方法提供方法体。接口本身不包含实现细节,所有的实现细节都由实现该接口的类来提供。

例如,在我们的机器人汽车示例中,汽车制造商会实现该接口。不同的汽车品牌(例如雪佛兰和丰田)会根据各自的实现来提供具体的功能,但它们都会遵循同样的接口规范。作为接口的使用者,GPS 导航系统会根据接口定义的方法来操作汽车。

public class ChevroletCar implements OperateCar {

    @Override
    public int turn(Direction direction, double radius, double startSpeed, double endSpeed) {
        // Chevrolet 的具体转向实现
        return 0; // 返回一个状态码
    }

    @Override
    public int changeLanes(Direction direction, double startSpeed, double endSpeed) {
        // Chevrolet 的具体变道实现
        return 0; // 返回一个状态码
    }

    // 实现其他方法...
}

接口作为 API

在商业软件中,接口常常作为应用程序编程接口(API)使用。例如,数字图像处理公司可以编写一个接口,定义一组图像处理方法(如旋转、裁剪、滤镜等),然后其他公司可以基于该接口实现具体的功能。

  • 图像处理公司:编写实现了接口的类,并将其公开作为 API
  • 客户公司:使用该接口的定义来调用图像处理方法,而无需了解其具体实现细节。

接口允许软件开发人员在不同的实现之间进行分离,使得客户和开发人员可以独立工作,减少依赖关系。

定义接口

接口的声明由修饰符、关键字 interface、接口名称、继承的父接口(如果有)以及接口体组成。接口体中可以包含常量声明、抽象方法、默认方法和静态方法。

public interface GroupedInterface extends Interface1, Interface2, Interface3 {

    // 常量声明
    double E = 2.718282; // 自定义常量

    // 方法签名
    void doSomething(int i, double x);
    int doSomethingElse(String s);
}

在上述例子中,GroupedInterface 接口继承了多个接口(Interface1, Interface2, Interface3),并且声明了常量和方法签名。

接口中的方法

接口中的方法有三种类型:

  1. 抽象方法:没有方法体,仅有方法签名。所有实现该接口的类必须实现这些方法。

    void doSomething(int i, double x); // 抽象方法
    
  2. 默认方法:通过 default 关键字声明,允许接口为实现类提供默认的实现。

    default void defaultMethod() {
        System.out.println("This is a default method.");
    }
    
  3. 静态方法:通过 static 关键字声明,静态方法属于接口本身,而不是接口的实现类。

    static void staticMethod() {
        System.out.println("This is a static method.");
    }
    
  4. 私有方法Java 9 引入):通过 private 关键字声明,私有方法仅在接口内部使用,用于避免方法重复。

    private void helperMethod() {
        System.out.println("This is a private method.");
    }
    

接口的常量

接口中的常量默认是 public static final,因此,可以省略这些修饰符:

public interface MyInterface {
    int MAX_SPEED = 120; // 隐式 public static final
}

接口的继承

接口可以继承其他接口,一个接口可以扩展多个接口:

public interface ExtendedInterface extends Interface1, Interface2 {
    // 继承多个接口
}

总结

  • 接口Java 中用于定义类之间交互“契约”的一种结构。它定义了方法签名,而不包含方法实现。
  • 实现接口的类必须提供接口中定义的所有方法的实现。
  • 接口可以包含常量、抽象方法、默认方法、静态方法和私有方法。
  • 接口在 **API(应用程序编程接口)**中扮演着重要角色,允许软件组件之间解耦。

通过接口,可以实现更加灵活的设计,支持多重继承和扩展,同时使代码更具可维护性和可重用性。