02_oo_02_interface

第十五章 接口(Interface)

1 简介

在Java语言中,接口是与类不同的一个概念。接口描述的是服务,是类需要提供和实现的服务内容。接口并不包含成员变量或者成员方法的实现(default方法除外)。因此,接口不能被实例化。Java语言支持两种接口,正常接口(Normal Interface)和标注(Annotation Type)。我们在本章中介绍正常接口。我们将会在下一章详细介绍标注

接口的定义由关键字interface标识。在接口中,开发人员可以声明一些变量和方法原型,用于标识该接口提供的服务。在接口中声明的变量默认是公开的(public)、静态的(static)和不变的(final)。在声明变量时,这些修饰词(Modifier)可以省略。接口中声明的成员方法默认是公开的(public)和抽象的(abstract)。在声明时,这些修饰词也可以省略。

interface InterfaceName {
    fields
    ...
    method
    ...
}

我们可以在下面的接口中声明常量。三个静态常量RED、GREEN和BLUE分别表示红色、绿色和蓝色。在声明它们的同时,我们使用了整形字面常量初始化它们。

interface BaseColors {
    int RED = 1, GREEN = 2, BLUE = 4;
}

在下面的Comparable接口的声明中,我们可以看出,compareTo()是一个抽象的成员方法。它是公开的,可以在其他类中访问这个方法。

interface Comparable {
    int compareTo(Object other);
}

上述Comparable接口并没有使用任何修饰符。默认情况下,接口可以被本包中的任何类访问。当接口声明为public时,该接口可以被任何包中的任何类访问。修饰符protected和private只能用于声明内部接口(Inner Interface),即声明在类中的接口。

与此同时,接口还可以实现default方法。default方法是一种成员方法。如果在实现接口方法中存在相似的逻辑,我们可以把这些逻辑放在default方法中。在继承或者实现接口的子类中,我们可以直接访问default方法。因此,在实现接口的子类中,无需重新实现并覆盖接口中的default方法。但是,如果需要,子接口或者子类也可以覆盖父接口的default方法。如下是一个声明了default方法的接口Top。

interface Top {
    default String name() {
        return "Top"; 
    }
}

2 接口的继承

一个接口可以继承一个或者多个接口。接口的声明中使用关键字extends表示接口继承关系。子接口会继承父接口的静态常量和成员方法。

例如,我们在下面声明了三个接口。A和B是两个独立的接口,它们分别声明了一个成员方法printA()和printB()。接口C继承自A和B。所以,接口C也包含成员方法printA()和printB()。

interface A {
    void printA();
}

interface B {
    void printB();
}

interface C extends A, B {

}

3 接口的实现

在定义了接口之后,开发人员需要在类中实现接口服务。在类的声明中使用关键字implements表示类实现了哪些接口。一个类可以实现多个接口。接口的名称在implements关键字之后,一一列出。多个接口的名称以逗号分隔。

当实现了一个接口之后,类必须提供相应的实现方法,以覆盖接口中对应的接口方法。抽象类可以仅实现部分的接口方法,但是一个具体的类必须实现所有的抽象方法。

public class Student implements C {
    @Override
    public void printA() {
        System.out.println("This is an object of interface A.");
    }

    @Override
    public void printB() {
        System.out.println("This is an object of interface B.");
    }
}

4 小结

接口用于表达程序的功能和服务,但是接口并不实现这些功能服务。这些功能和服务将交由具体的子类实现。Java语言支持两种接口。我们在本章中介绍了普通的接口。在Java语言中,一个类或者接口可以继承/实现多个父接口,但是,一个类只能有一个直接父类,因为Java语言不支持类的多重继承。我们将在下一章介绍一种特殊的接口:标注(Annotation)

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.