Interface 接口

Java 中的 接口,可以被认为是一种标准, 实现这个接口的所有类, 都遵循这个接口的标准。Java 中的类不允许有多继承, 但是允许实现多个接口。

考虑一个场景, 在中国所有家用电器的充电器都遵循一个标准, 那就是充电电压为 220V 。为此,我们实现了一个接口 ICharger。

  • 接口有关键字 interface 表示,接口一般以大写字母 I 打头命名。

  • 我们在这个接口里面设置了一个 maxVoltage 变量表示充电电压,chargerVoltage 用于输出充电电压到命令行。chargerVoltage() 函数设置为 static 表示这是这个标准的固有属性,充电电压就是220V,不能改变。

  • chargerType()表示输出充电器种类的函数, 比如是两孔还是三孔?这个交给这个接口的类去实

public interface ICharger {
    int maxVoltage=220;//220伏 充电电压

    static void chargerVoltage() {
        System.out.println("默认充电电压 : "+maxVoltage +" V");
    }

    //非static和default函数,一定要重写
    void chargerType() ;
}

接口中的所有成员变量和函数 访问限制符 都默认是 public, 可以不写。这也非常好理解, 因为标准就是给别人用的,就是应该公开透明,让大家去遵守。

接口中的所有成员变量 都是 final static 型。这样非常好理解, 因为标准是不能改的,标准是不随实现这个标准的对象变化而变化的。比如 maxVoltage 表示充电电压,就应该是220V, 不能更改。要是更改了,这个标准也就变了。

考虑另一个标准:上网。但是, 具体怎么上网,是用WIFI 还是用 SIM卡上网不知道。我们可以让上网这个接口被其他接口去继承。

public interface INet {
    void connect();
}

WIFI接口,继承了 上网接口。同时将connect 设置为 default 函数。设置为default函数的意义在于,给这个函数一个默认的函数体,如果实现这个接口的类不重写default函数,也可以调用default函数。

public interface IWIFI extends INet{
    default void connect() {
        System.out.println("使用WIFI上网");
    }
}

类似的,还有一个 SIM卡接口, 继承了上网接口。我们也将connect 设置为 default 函数。

public interface ISIM extends INet{
    default void connect() {
        System.out.println("我使用SIM卡上网");
    }
}

现在有一个智能手机 SmartPhone类,实现了 ICharger 接口,IWIFI 接口,ISIM接口。并且对 chargerType 和 connect 函数进行了重写。

public class SmartPhone implements ICharger,IWIFI,ISIM {
    @Override
    public void chargerType() {
        System.out.print("智能手机使用两孔充电器,");
        ICharger.chargerVoltage();
    }

    @Override
    public void connect() {
        System.out.println("智能手机使用 WIFI 和 SIM卡 上网");
    }

}

测试一下我们写的 SmartPhone 类

public class SmartPhoneTest {
    public static void main(String[] args) {
        SmartPhone phone = new SmartPhone();
        phone.connect();//输出: 智能手机使用 WIFI 和 SIM卡 上网
        phone.chargerType();//输出: 智能手机使用两孔充电器,默认充电电压 : 220 V
    }
}

总结一下 Java 接口

  • 接口表示一个标准,所有实现了这个标准的类都遵循一定的规则。

  • 接口可以被继承。

  • 一个类可以实现多个接口。

  • 接口默认是abstract的,接口是不能被实例化的, 只能被实现。

  • 接口的成员变量默认是 final, static 类型的,因为标准是不能更改的,成员变量代表了标准的固有属性。

  • 接口函数可以是static类型,表示这个函数代表了这个接口的固有属性。

  • 接口函数还可以是default类型,表示给这个函数一个默认的函数体。

  • 如果接口函数不是static,也不是default类型,接口函数必须要被实现接口的类重写。

Last updated

Was this helpful?