Skip to content

接口

Java 中,接口是一种抽象类型,用来规定类必须实现的一组方法。它可以看作是一个“契约”或“协议”,实现接口的类必须提供接口中定义的方法实现。

接口

接口中只能存在常量+抽象方法。接口也是类的一种

继承关系

接口默认继承Object,可以调用Object中的方法

构造方法

接口没有构造方法,无法被实例化

接口属性

接口可以有属性,但必须是 public static final 常量。

常量的public static final可以省略

java
public interface UserConstants {

    // 实际上等价于:public static final String TYPE = "ADMIN";
    String TYPE = "ADMIN";

    int MAX_COUNT = 100;
}

抽象方法

接口中的抽象方法的public abstract可以省略

java
public interface Animal {
    void eat();  // 抽象方法
}

接口

定义接口

java
// 定义接口
public interface Animal {
    void eat();  // 抽象方法
    void sleep();
    
    default void run() { // 默认方法
        System.out.println("Animal is running");
    }
    
    static void breathe() { // 静态方法
        System.out.println("Animal breathes");
    }
}

实现接口

java
// 实现接口
public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("Dog eats bones");
    }

    @Override
    public void sleep() {
        System.out.println("Dog sleeps in kennel");
    }
}

一个类可以实现多个接口,解决了 Java 单继承的限制

java
interface Flyer { void fly(); }
interface Swimmer { void swim(); }

class Duck implements Flyer, Swimmer {
    public void fly() { System.out.println("Duck flies"); }
    public void swim() { System.out.println("Duck swims"); }
}

多继承接口

Java 中接口是可以多继承的,而且这是接口相比类最大的优势之一(类只能单继承)。

一个接口可以继承多个接口,用逗号分隔即可:

java
interface A {
    void methodA();
}

interface B {
    void methodB();
}

// 接口C继承A和B
interface C extends A, B {
    void methodC();
}

实现多继承接口时,必须实现所有父接口中的方法

java
class Impl implements C {
    @Override
    public void methodA() {
        System.out.println("实现A的方法");
    }

    @Override
    public void methodB() {
        System.out.println("实现B的方法");
    }

    @Override
    public void methodC() {
        System.out.println("实现C的方法");
    }
}

面向接口编程

面向接口调用者称为接口调用者。面向接口实现者称为接口实现者。

调用者和实现者通过接口达到了解耦。调用者不需要关心具体的实现者,实现者也不需要关心具体的调用者。双方都遵循接口开发规范。

默认/静态方法(JDK 8+)

默认方法

引入默认方法是为了解决接口演变的问题:接口中定义抽象方法,但是不能实现这些方法,所有实现类必须实现这些抽象方法。当我们向接口中添加或删除一个抽象方法,这会破坏接口的所有实现类,所有实现类都需要修改代码同步更新。

java
public interface Animal {
    void eat();  // 抽象方法

    default void sleep() {  // 默认方法
        System.out.println("Animal is sleeping");
    }
}

我们可以将新方法设置为默认方法,所有实现类可以自行决定是否实现。

需要删除的接口也可以将其设为默认方法,新的实现类不会实现这个要删除的方法,同时不影响原来的实现类

静态方法

静态方法属于接口本身,而不是实现类,和类的静态方法类似,主要作用是提供 工具方法或辅助方法,不依赖于接口实现对象。

静态方法只能使用本接口访问,无法使用实现类的类名访问

java
public interface Animal {
    void eat(); // 抽象方法

    static void breathe() { // 静态方法
        System.out.println("Animal breathes");
    }
}

私有方法 (JDK 9+)

Java 9 之后,接口可以定义 私有方法(private 方法),它只能在接口内部被调用,不能被实现类访问或重写。主要目的是 给接口内部的默认方法或静态方法提供共用的辅助逻辑,避免重复代码。

java
public interface Animal {
    void eat(); // 抽象方法

    default void sleep() {
        System.out.println("Animal starts sleeping");
        log("sleep"); // 调用私有方法
    }

    static void breathe() {
        System.out.println("Animal breathes");
        logStatic("breathe"); // 调用私有静态方法
    }

    // 私有实例方法
    private void log(String action) {
        System.out.println("Logging action: " + action);
    }

    // 私有静态方法
    private static void logStatic(String action) {
        System.out.println("Static logging: " + action);
    }
}

接口与抽象类