Loading... # 语法格式 ```java [修饰符] interface 接口名 extends 父接口1, 父接口2, ... { 0-N 常量 0-N 抽象方法 0-N 内部类、接口、枚举 0-N 默认方法或静态方法 // Java 8 以上才允许 } ``` # 成员特点 - 没有构造器,不能实例化 - 成员变量默认都使用 `public` `static` `final` 修饰,**全局静态常量** - 抽象方法默认都使用 `public` `abstract` 修饰,**公共的抽象方法**,所以实现类中的**实现方法**必须使用`public`修饰(接口里定义的方法一般不写修饰符) - 内部类默认都使用 `public` `static` 修饰,**公共的静态内部类** - 接口中的默认方法不需要实现类实现 # 关系 - 接口与接口之间继承关系`extends`,**支持多继承** - 类与接口之间有 实现关系`implements`,可以多实现 - 一个类实现了一个或多个接口之后,这个类必须**完全实现**(重写)这些接口里所定义的全部抽象方法,否则该类必须定义成**抽象类** - **实现接口方法时,必须使用 `public` 修饰** ```java [修饰符] class 实现类名 extends 父类 implements 接口1, 接口2, ... { } ``` # 行为多继承的冲突解决规则 - **默认方法**可以用于创建可选方法和行为的多继承 - 如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断: - **类或父类**中**显式声明**的方法,其优先级高于所有的默认方法 - 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择**拥有最具体实现**的默认方法的接口,即如果 B 继承了 A,那么 B 就比 A 更加具体。 - 最后,如果还是无法判断,继承了多个接口的类必须显式地指定使用哪一个接口中的方法,`X.super.m(…)`(其中 X 是希望调用的 m 方法所在的父接口) # 接口多态声明方式 ```java // 接口名 变量名 = new 该接口的实现类名(); // 面向接口编程 IWalkable w = new Tiger(); ``` ```java public interface IWalkable { int LEG_NUMBER = 2; void walk(); } public interface ISwimable java{ 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; } } ``` # 接口和抽象类 - 接口体现的是一种**规范**,抽象类体现的是一种**模板式设计** 最后修改:2022 年 07 月 30 日 © 允许规范转载 打赏 赞赏作者 赞 1 如果觉得我的文章对你有用,请随意赞赏