接口
接口是Java中的一种类型【引用数据类型】主要有两个成分:方法,常量。
定义接口的格式:
[public] interface 接口名{ //方法 注意:接口中的抽象方法默认会自动加上public abstract修饰程序员无需自己手写!! //常量 接口中常量必须要给初始值,常量命名规范建议字母全部大写,多个单词用下划线连接。 }
接口是Java中的一种类型,没有构造方法,而且是抽象类型,不能直接创建对象使用。和抽象类很相似,需要定义子类去实现接口。
类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements
关键字。
类实现接口的格式
[修饰符] class 类名 implements 接口名1,接口名2,...{//接口可以同时实现多个接口 //实现所有的抽象方法 }
要求:
-
子类必须重写实现全部接口中所有的抽象方法。
-
若父接口中某个抽象方法未重写实现,这个子类也必须定义成抽象类。
==类实现接口的意义==:接口体现的是一种规范,接口对实现类是一种强制性的约束,要么全部完成接口申明的功能,要么自己也定义成抽象类。
1 接口与接口的多继承
【目标】:理解接口的多继承
接口与接口之间可以产生继承关系,和类的继承含义一样。父接口中成员会继承到子接口中去。
所有使用的关键字也是:extends
接口继承接口就是把其他接口的抽象方法与本接口进行了合并。
注意:如果多个父接口存在相同的常量,子类对象无法调用。建议使用接口名分别调用。
2 JDK 8之后的接口新增方法
-
JDK8新增默认方法,静态方法。
-
JDK9新增私有方法【了解】
【目标】:掌握这些方法的定义格式,及使用方式
2.1 接口中默认方法定义及使用
==默认方法不是抽象方法,而是具体的方法。==
【默认方法格式】
[public] default 返回值类型 方法名(参数列表){ 方法体 }
借助实现类去使用:
-
直接继承使用
-
重写使用【一旦重写,父接口中的默认方法就废弃了】
2.2 接口静态方法定义及使用
JDK8新增的方法
【静态方法格式】
[public] static 返回值类型 方法名(参数列表){ //方法体 }
如何使用?
-
直接使用接口名调用
定义一个接口,内部定义静态方法
==结论:接口中的静态方法,不能用子类对象调用或者子类名调用,只能使用接口名调用==
3 类实现多个接口使用注意事项
3.1 多个接口同名静态方法私有方法
如果一个类实现了多个接口,多个接口中存在相同的静态方法,私有方法会对子类造成影响么?
静态方法和私有方法在子类中都不能被访问调用。和子类没啥关系。对于自实现类没有任何的意义。
3.2 多个接口同名默认方法
一个类父接口中存在相同的默认方法,会对子类有什么影响么?
子类会报错,需要强制重写该冲突的默认方法。
3.3 优先级的问题
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
==父类的这个方法相当于通过子类去重写了父接口中的方法。==
【类继承父类同时实现父接口的格式】
注意:继承一定要在实现的前面
[public] class A类 extends B类 implements 接口1,接口2,接口3,.. { }
4接口中定义空接口的目的:
表示该类具有的标志。
在实际开发中,定义一些接口,表示该类能做什么事,若没有实现,表示不能做什么事。
5 A类继承B类且实现多个接口
6 接口小结
-
接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
-
接口中JDK8之前方法全是抽象方法,默认会自动加上public abstract修饰【JDK8之前不包含8】
-
JDK 8开始,接口不再纯洁,支持静态方法,默认方法,(JDK9)私有方法。
-
接口中,没有构造器,不能创建对象,最根本的原因接口是抽象的。
-
类与接口是多实现的
-
接口与接口是多继承的
-
接口体现的规范。