baeldung 2025-07-23
1. 概述
在本教程中,我们将讨论 Java 中的接口(Interface)。我们还将了解 Java 如何利用接口实现多态性(Polymorphism)和多重继承(Multiple Inheritance)。
2. 什么是 Java 中的接口?
在 Java 中,接口是一种抽象类型,包含一组方法和常量变量。它是 Java 的核心概念之一,用于实现抽象、多态性和多重继承。
下面是一个简单的 Java 接口示例:
public interface Electronic {
// 常量变量
String LED = "LED";
// 抽象方法
int getElectricityUse();
// 静态方法
static boolean isEnergyEfficient(String electronicType) {
if (electronicType.equals(LED)) {
return true;
}
return false;
}
// 默认方法
default void printDescription() {
System.out.println("Electronic Description");
}
}
我们可以使用 implements 关键字在一个 Java 类中实现该接口。
接下来,我们创建一个 Computer 类,实现上面定义的 Electronic 接口:
public class Computer implements Electronic {
@Override
public int getElectricityUse() {
return 1000;
}
}
2.1 创建接口的规则
在接口中,我们可以使用以下内容:
- 常量变量(constant variables)
- 抽象方法(abstract methods)
- 静态方法(static methods)
- 默认方法(default methods)
同时,还需注意以下几点:
- 不能直接实例化接口
- 接口可以是空的(即不包含任何方法或变量)
- 不能在接口定义中使用
final关键字,否则会导致编译错误 - 所有接口声明必须使用
public或默认(包私有)访问修饰符;编译器会自动为其添加abstract修饰符 - 接口中的方法不能是
protected或final - 在 Java 9 之前,接口方法不能是
private;但从 Java 9 开始,允许在接口中定义私有方法 - 接口中的变量默认是
public、static和final,不允许更改其可见性
3. 使用接口能实现什么?
3.1 行为功能(Behavioral Functionality)
我们使用接口为不相关的类添加特定的行为功能。例如,Comparable、Comparator 和 Cloneable 是 Java 提供的接口,可以被不相关的类实现。
以下是一个使用 Comparator 接口比较两个 Employee 实例的示例:
public class Employee {
private double salary;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
public class EmployeeSalaryComparator implements Comparator<Employee> {
@Override
public int compare(Employee employeeA, Employee employeeB) {
if (employeeA.getSalary() < employeeB.getSalary()) {
return -1;
} else if (employeeA.getSalary() > employeeB.getSalary()) {
return 1;
} else {
return 0;
}
}
}
更多信息,请参阅我们的《Java 中的 Comparator 与 Comparable 教程》。
3.2 多重继承(Multiple Inheritance)
Java 类只支持单继承(即一个类只能继承一个父类),但通过接口,我们可以实现多重继承。
例如,下面的 Car 类同时实现了 Fly 和 Transform 两个接口,从而继承了 fly() 和 transform() 方法:
public interface Transform {
void transform();
}
public interface Fly {
void fly();
}
public class Car implements Fly, Transform {
@Override
public void fly() {
System.out.println("I can Fly!!");
}
@Override
public void transform() {
System.out.println("I can Transform!!");
}
}
3.3 多态性(Polymorphism)
首先,什么是多态性?
多态性是指对象在运行时能够呈现不同形式的能力。更具体地说,它指的是在运行时根据对象的实际类型调用相应的重写方法。
在 Java 中,我们可以使用接口实现多态性。例如,Shape 接口可以表现为 Circle 或 Square。
首先定义 Shape 接口:
public interface Shape {
String name();
}
然后创建 Circle 类:
public class Circle implements Shape {
@Override
public String name() {
return "Circle";
}
}
再创建 Square 类:
public class Square implements Shape {
@Override
public String name() {
return "Square";
}
}
最后,让我们通过代码演示多态性的实际应用:创建一些 Shape 对象,将它们加入列表,并循环打印名称:
List<Shape> shapes = new ArrayList<>();
Shape circleShape = new Circle();
Shape squareShape = new Square();
shapes.add(circleShape);
shapes.add(squareShape);
for (Shape shape : shapes) {
System.out.println(shape.name());
}
输出结果:
Circle
Square
4. 接口中的默认方法(Default Methods in Interfaces)
在 Java 7 及更早版本中,传统接口不具备向后兼容性。
这意味着:如果你有一段用 Java 7 或更早版本编写的旧代码,当你向现有接口中添加一个新的抽象方法时,所有实现该接口的类都必须重写这个新方法,否则代码将无法编译。
Java 8 通过引入“默认方法”解决了这个问题。默认方法是可选的,可以在接口层面提供默认实现,从而避免破坏已有代码。
5. 接口继承规则
为了通过接口实现多重继承,我们需要记住一些规则。下面我们详细说明。
5.1 接口继承另一个接口
当一个接口继承另一个接口时,它会继承父接口中的所有抽象方法。
例如,我们先定义两个接口 HasColor 和 Shape:
public interface HasColor {
String getColor();
}
public interface Box extends HasColor {
int getHeight();
}
在上面的例子中,Box 接口使用 extends 关键字继承了 HasColor 接口,因此 Box 现在拥有两个方法:getColor() 和 getHeight()。
5.2 抽象类实现接口
当一个抽象类实现某个接口时,它会继承该接口的所有抽象方法和默认方法。
例如,考虑 Transform 接口和实现它的抽象类 Vehicle:
public interface Transform {
void transform();
default void printSpecs(){
System.out.println("Transform Specification");
}
}
public abstract class Vehicle implements Transform {}
在这个例子中,Vehicle 类继承了两个方法:抽象方法 transform() 和默认方法 printSpecs()。
6. 函数式接口(Functional Interfaces)
Java 从早期版本就提供了许多函数式接口,例如:
Comparable(自 Java 1.2 起)Runnable(自 Java 1.0 起)
Java 8 引入了新的函数式接口,如 Predicate、Consumer 和 Function。
7. 结论
在本教程中,我们概述了 Java 接口的基本概念,并探讨了如何使用接口实现多态性和多重继承。接口是 Java 面向对象编程中不可或缺的一部分,能够提升代码的灵活性、可扩展性和复用性。