接口
1. 概述
我们已经学完了抽象类,抽象类中可以有抽象方法,也可以有普通方法,构造器,成员变量等。那么什么是接口呢?接口是更加彻底的抽象,接口中全部是抽象方法。(JDK8之前),接口同样是不能创建对象的。
2. 定义格式
1 | //接口的定义格式: |
3. 接口成分的特点
在JDK8之前,接口中的成分包含:抽象方法和常量
3.1 抽象方法
注意:接口中的抽象方法默认会自动加上public abstract修饰程序员无需自己手写!! 按照规范:以后接口中的抽象方法建议不要写上public abstract。因为没有必要啊,默认会加上。
3.2 常量
在接口中定义的成员变量默认会加上: public static final修饰。也就是说在接口中定义的成员变量实际上是一个常量。这里是使用public static final修饰后,变量值就不可被修改,并且是静态化的变量可以直接用接口名访问,所以也叫常量。常量必须要给初始值。常量命名规范建议字母全部大写,多个单词用下划线连接。
3.3 案例演示
1 | public interface InterF { |
4. 基本实现
4.1 实现接口的概述
类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用
implements
关键字。
4.2 实现接口的格式
1 | /**接口的实现: |
从上面格式可以看出,接口是可以被多实现的。
4.3 类实现接口的要求和意义
- 必须重写实现的全部接口中所有抽象方法。
- 如果一个类实现了接口,但是没有重写完全部接口的全部抽象方法,这个类也必须定义成抽象类。
- 意义:接口体现的是一种规范,接口对实现类是一种强制性的约束,要么全部完成接口申明的功能,要么自己也定义成抽象类。这正是一种强制性的规范。
4.4 类与接口的基本案例
假如我们定义一个运动员的接口(规范),代码如下:
1 | /** |
接下来定义一个乒乓球运动员类,实现接口,实现接口的实现类代码如下:
1 | /** |
测试代码:
1 | public class TestMain { |
4.5 类与接口的多实现案例
类与接口之间的关系是多实现的,一个类可以同时实现多个接口。
首先我们先定义两个接口,代码如下:
1 | /** 法律规范:接口*/ |
然后定义一个实现类:
1 | /** |
从上面可以看出类与接口之间是可以多实现的,我们可以理解成实现多个规范,这是合理的。
5.接口与接口的多继承
Java中,接口与接口之间是可以多继承的:也就是一个接口可以同时继承多个接口。大家一定要注意:
类与接口是实现关系
接口与接口是继承关系
接口继承接口就是把其他接口的抽象方法与本接口进行了合并。
案例演示:
1 | public interface Abc { |
6. JDK8之后接口的新增方法
从JDK 8开始之后,接口不再纯洁了,接口中不再只是抽象方法,接口还可以有默认方法(也就是实例方法),和静态方法了,还包含了私有实例方法和私有静态方法。
6.1 默认方法和静态方法
默认方法:使用 default
修饰,不可省略,供子类调用或者子类重写。
静态方法:使用 static
修饰,供接口直接调用。
代码如下:
1 | public interface InterFaceName { |
6.2 私有方法和私有静态方法
私有方法:使用 private
修饰,供接口中的默认方法或者静态方法调用。
代码如下:
1 | public interface InterFaceName { |
6.3 新增方法的使用
默认方法和静态方法以及私有方法和私有静态方法,遵循面向对象的继承关系使用原则,实现类依然可以访问接口的非私有方法,对于接口中的非私有静态方法,可以直接通过接口名进行访问。
重写默认方法注意(了解):
子接口重写默认方法时,default关键字可以保留。
实现类重写默认方法时,default关键字不可以保留。
7. 实现多个接口的注意事项
7.1 多个接口的同名静态方法
如果实现了多个接口,多个接口中存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
1 | public interface A { |
7.2 优先级的问题
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。代码如下:
定义接口:
1 | interface A { |
定义父类:
1 | class D { |
定义子类:
1 | class C extends D implements A { |
定义测试类:
1 | public class Test { |
输出结果:
1 | DDDDDDDDDDDD |
8. 接口小结
- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
- 接口中的方法全是抽象方法,默认会自动加上public abstract修饰
- JDK 8开始,接口不再纯洁,支持静态方法,默认方法,私有方法。
- 接口中,没有构造器,不能创建对象。
- 类与接口是多实现的
- 接口与接口是多继承的
- 接口体现的规范。