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),并且声明了常量和方法签名。
接口中的方法
接口中的方法有三种类型:
-
抽象方法:没有方法体,仅有方法签名。所有实现该接口的类必须实现这些方法。
void doSomething(int i, double x); // 抽象方法 -
默认方法:通过
default关键字声明,允许接口为实现类提供默认的实现。default void defaultMethod() { System.out.println("This is a default method."); } -
静态方法:通过
static关键字声明,静态方法属于接口本身,而不是接口的实现类。static void staticMethod() { System.out.println("This is a static method."); } -
私有方法(
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(应用程序编程接口)**中扮演着重要角色,允许软件组件之间解耦。
通过接口,可以实现更加灵活的设计,支持多重继承和扩展,同时使代码更具可维护性和可重用性。