Java 接口详解

更新于 2025-12-27

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 修饰符
  • 接口中的方法不能是 protectedfinal
  • 在 Java 9 之前,接口方法不能是 private;但从 Java 9 开始,允许在接口中定义私有方法
  • 接口中的变量默认是 publicstaticfinal,不允许更改其可见性

3. 使用接口能实现什么?

3.1 行为功能(Behavioral Functionality)

我们使用接口为不相关的类添加特定的行为功能。例如,ComparableComparatorCloneable 是 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 中的 ComparatorComparable 教程》。

3.2 多重继承(Multiple Inheritance)

Java 类只支持单继承(即一个类只能继承一个父类),但通过接口,我们可以实现多重继承

例如,下面的 Car 类同时实现了 FlyTransform 两个接口,从而继承了 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 接口可以表现为 CircleSquare

首先定义 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 接口继承另一个接口

当一个接口继承另一个接口时,它会继承父接口中的所有抽象方法。

例如,我们先定义两个接口 HasColorShape

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 引入了新的函数式接口,如 PredicateConsumerFunction


7. 结论

在本教程中,我们概述了 Java 接口的基本概念,并探讨了如何使用接口实现多态性多重继承。接口是 Java 面向对象编程中不可或缺的一部分,能够提升代码的灵活性、可扩展性和复用性。