ZetCode

Java 接口

最后修改于 2024 年 1 月 27 日

在本文中,我们将展示如何使用 Java 接口。

接口定义了一个约定,任何扩展该接口的类都必须实现该约定。

遥控器是观看者和电视之间的接口。 它是这个电子设备的接口。 外交协议指导外交领域的所有活动。 道路规则是驾车者、骑自行车者和行人必须遵守的规则。 编程中的接口类似于前面的例子。

接口是

对象通过它们公开的方法与外部世界交互。 实际的实现对于程序员来说并不重要,或者也可能是秘密的。 一家公司可能会销售一个库,并且不希望公开实际的实现。 程序员可能会在 GUI 工具包的窗口上调用 `maximize` 方法,但对该方法的实现方式一无所知。 从这个角度来看,接口是对象与外部世界交互的方式,而无需过多地暴露其内部工作原理。

从第二个角度来看,接口是约定。 它们用于设计应用程序的架构并帮助组织代码。

接口是完全抽象的类型。 它们使用 `interface` 关键字声明。 在 Java 中,接口是一种引用类型,类似于只能包含常量、方法签名和嵌套类型的类。 没有方法体。 接口不能被实例化——它们只能由类实现或由其他接口扩展。

所有接口成员都隐式地具有公共访问权限。 接口不能有完全实现的方法。 一个 Java 类可以实现任意数量的接口。 一个接口也可以扩展任意数量的接口。 实现接口的类必须实现接口的所有方法签名。

接口用于模拟多重继承。 一个 Java 类只能从一个类继承,但它可以实现多个接口。 接口的多重继承不是关于继承方法和变量,而是关于继承接口描述的思想或约定。

接口的主体包含抽象方法,但由于接口中的所有方法在定义上都是抽象的,因此不需要抽象关键字。 由于接口指定了一组公开的行为,因此所有方法都是隐式公共的。 除了方法声明之外,接口还可以包含常量成员声明。 在接口中定义的所有常量值都是隐式地 `public`、`static` 和 `final`。 这些修饰符可以省略。

接口和抽象类之间有一个重要的区别。 抽象类为继承层次结构中相关的类提供部分实现。 另一方面,接口可以由彼此不相关的类实现。

Java 接口简单示例

以下是一个使用 Java 接口的简单程序。

com/zetcode/SimpleInterface.java
package com.zetcode;

interface IInfo {

    void doInform();
}

class Some implements IInfo {

    @Override
    public void doInform() {

        System.out.println("This is Some Class");
    }
}

public class SimpleInterface {

    public static void main(String[] args) {

        Some sm = new Some();
        sm.doInform();
    }
}

我们有一个接口和一个实现该接口的类。

interface IInfo {

    void doInform();
}

这是一个接口 `IInfo`。 它具有 `doInform` 方法签名。

class Some implements IInfo {

我们实现 `IInfo` 接口。 要实现特定的接口,我们使用 `implements` 关键字。

@Override
public void doInform() {

    System.out.println("This is Some Class");
}

该类为 `doInform` 方法提供了一个实现。 `@Override` 注释告诉编译器我们正在重写一个方法。

Java 多接口

Java 不允许直接从多个类继承。 它允许实现多个接口。 下一个示例展示了一个类如何实现多个接口。

com/zetcode/MultipleInterfaces.java
package com.zetcode;

interface Device {

    void switchOn();

    void switchOff();
}

interface Volume {

    void volumeUp();

    void volumeDown();
}

interface Pluggable {

    void plugIn();

    void plugOff();
}

class CellPhone implements Device, Volume, Pluggable {

    @Override
    public void switchOn() {

        System.out.println("Switching on");
    }

    @Override
    public void switchOff() {

        System.out.println("Switching on");
    }

    @Override
    public void volumeUp() {

        System.out.println("Volume up");
    }

    @Override
    public void volumeDown() {

        System.out.println("Volume down");
    }

    @Override
    public void plugIn() {

        System.out.println("Plugging in");
    }

    @Override
    public void plugOff() {

        System.out.println("Plugging off");
    }
}

public class MultipleInterfaces {

    public static void main(String[] args) {

        CellPhone cp = new CellPhone();
        cp.switchOn();
        cp.volumeUp();
        cp.plugIn();
    }
}

我们有一个 CellPhone 类,它继承自三个接口。

class CellPhone implements Device, Volume, Pluggable {

该类实现了所有三个接口,它们用逗号分隔。 `CellPhone` 类必须实现所有三个接口的所有方法签名。

$ java com.zetcode.MultipleInterfaces
Switching on
Volume up
Plugging in

Java 接口层次结构

下一个示例展示了接口如何形成层次结构。 接口可以使用 `extends` 关键字从其他接口继承。

com/zetcode/InterfaceHierarchy.java
package com.zetcode;

interface IInfo {

    void doInform();
}

interface IVersion {

    void getVersion();
}

interface ILog extends IInfo, IVersion {

    void doLog();
}

class DBConnect implements ILog {

    @Override
    public void doInform() {

        System.out.println("This is DBConnect class");
    }

    @Override
    public void getVersion() {

        System.out.println("Version 1.02");
    }

    @Override
    public void doLog() {

        System.out.println("Logging");
    }

    public void connect() {

        System.out.println("Connecting to the database");
    }
}

public class InterfaceHierarchy {

    public static void main(String[] args) {

        DBConnect db = new DBConnect();
        db.doInform();
        db.getVersion();
        db.doLog();
        db.connect();
    }
}

我们定义了三个接口。 这些接口被组织成一个层次结构。

interface ILog extends IInfo, IVersion {

`ILog` 接口从两个接口继承。

class DBConnect implements ILog {

`DBConnect` 类实现了 `ILog` 接口。 因此,它必须实现所有三个接口的方法。

@Override
public void doInform() {

    System.out.println("This is DBConnect class");
}

`DBConnect` 类实现了 `doInform` 方法。 这个方法是由 `ILog` 接口继承的,该接口被该类实现。

$ java com.zetcode.InterfaceHierarchy
This is DBConnect class
Version 1.02
Logging
Connecting to the database

来源

什么是接口 - 教程

在本文中,我们展示了如何使用 Java 接口。

作者

我叫 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程