• 接口定义一种规范,规定某一批类里必须提供某些方法,要求这些类必须完全实现接口里所定义的全部抽象方法,从而实现接口中定义的功能。
  • 接口是对功能的抽象

# 语法格式

[修饰符] interface 接口名 extends 父接口1, 父接口2, ... {
    0-N 常量
    0-N 抽象方法
    0-N 内部类、接口、枚举
    0-N 默认方法或静态方法 // Java 8 以上才允许
}
1
2
3
4
5
6

# 成员特点

  • 没有构造器,不能实例化
  • 成员变量默认都使用 public static final 修饰,全局静态常量
  • 抽象方法默认都使用 public abstract 修饰,公共的抽象方法,所以实现类中的实现方法必须使用public修饰(接口里定义的方法一般不写修饰符)
  • 内部类默认都使用 public static 修饰,公共的静态内部类
  • 接口中的默认方法不需要实现类实现

# 关系

  • 接口与接口之间继承关系 extends支持多继承
  • 类与接口之间有实现关系 implements,可以多实现
    1. 一个类实现了一个或多个接口之后,这个类必须完全实现(重写)这些接口里所定义的全部抽象方法,否则该类必须定义成抽象类
    2. 实现接口方法时,必须使用 public 修饰
[修饰符] class 实现类名 extends 父类 implements 接口1, 接口2, ... {
}
1
2

# 行为多继承的冲突解决规则

  • 默认方法可以用于创建可选方法和行为的多继承
  • 如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断:
    1. 类或父类显式声明的方法,其优先级高于所有的默认方法
    2. 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果 B 继承了 A,那么 B 就比 A 更加具体。
    3. 最后,如果还是无法判断,继承了多个接口的类必须显式地指定使用哪一个接口中的方法,X.super.m(…)(其中 X 是希望调用的 m 方法所在的父接口)

# 接口多态声明方式

// 接口名 变量名 = new 该接口的实现类名();
// 面向接口编程
IWalkable w = new Tiger();
1
2
3
public interface IWalkable {
    int LEG_NUMBER = 2;
    void walk();
}

public interface ISwimable {
    void swim();
}

public class Animal {
    void breathe() {
    }
}

public class Human extends Animal implements IWalkable, ISwimable {
    public void walk() {
    }

    public void swim() {
    }

    public void speak() {
    }
}

public class InterfaceDemo {
    public static void main(String[] args) {
        System.out.println(IWalkable.LEG_NUMBER);
        IWalkable p = new Human(); // 面向接口编程
        p.walk();
        ((ISwimable) p).swim();
        ((Animal) p).breathe();
        ((Human) p).speak();
        Object obj = p;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 接口和抽象类

  • 接口体现的是一种规范,抽象类体现的是一种模板式设计
Updated at: 2021-06-27 22:41:45