Java接口

概述

有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。

另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接。

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系。

接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。

语法要求

类的关键字为class,接口关键字则为interface。

接口中一般有:常量、抽象方法。在java8后,接口中可以有静态方法和默认方法,Java9以后,可以有private的实例方法。但是,接口中不能具有实例字段(属性)以及构造器。

接口的特点:

  • 接口中的所有成员变量都默认是由public static final修饰的。
  • 接口中的所有抽象方法都默认是由public abstract修饰的。
  • 继承只能单继承,但接口可以多实现
interface ICpu
{
    String name = "Intel";
    void cpu ();
}

上述代码和下面是一样的

interface ICpu
{
    public static String name = "Intel";
    public abstract void cpu ();
}

Java8后,接口可以有静态方法:

interface ICpu
{
    String name = "Intel";
    void cpu ();

    public static String getName ()
    {
        return name;
    }
}

接口实现使用关键字implements,实现多个接口,将多个接口之间用,隔开

class Manager extends Employee implements Cloneable,Comparable
{
    // ...
}

instanceof

可使用instanceof来检查一个对象是否实现了某个特定接口:

if (anObject instanceof Comparable){...}

接口扩展

与类的继承一样,也可以扩展接口。允许有多条接口链,从通用性较高的接口扩展到专用性较高的接口。

public interface Moveable{
    void move (double x, double y);
}

public interface Powered extends Movable
{
    Double SPEED_LIMIT = 95;
    double milesPerGallon();
}