接口
接口是多个类的公共规范,接口是一种引用数据类型,最重要的内容就是其中的抽象方法。
public interface 接口名称{
//接口内容
}
//注意
//换成了关键字interface后,编译生成的字节码文件仍然是:.java->.class
如果是java7,接口中可以包含的内容有:
1、常量
2、抽象方法
java8可以多包含:
3、默认方法: 解决接口升级的问题
4、静态方法
java9还可多包含有:
5、私有方法
接口的实现类必须覆盖重写所有的抽象方法,如果未能重写所有的抽象方法,那么一定是抽象类,因为抽象方法所在的类一定是抽象类
默认方法:
public default void interfaceDefaultMethod(int a ,int b){
//方法体
}
静态方法:
public static void myStaticMethod(int a , double b){
//方法体
//注意,接口的静态方法不能由接口的实现类来调用
//因为一个类可以实现多个接口
//这就使得用实现类的对象去调用接口的静态方法可能存在冲突
}
用接口名称直接调用接口中的静态方法,接口名称.静态方法名
在接口中的默认方法调用私有方法
私有方法的存在为解决接口中默认方法中重复代码的问题,即只能在接口中由默认方法调用,但不能被接口的实现类对象调用,即应是私有的。java9开始接口中允许有私有方法。
1、普通私有方法,解决多个默认方法之间的重复代码问题
private 返回值类型 方法名称(参数列表){
方法体
}
2、静态私有方法,解决多个静态方法之间重复代码的问题
private static 返回值类型 方法名称(参数列表){
方法体
}
接口当中也可以定义“成员变量”,但是必须使用public static final三个关键字进行修饰。
从效果上看,这其实就是接口的【常量】。
格式:
public static final 数据类型 常量名称 = 数据值;
注意事项
1、接口当中的常量,可以省略public static final ,在ideal中呈灰色,不写也可,但须记住接口中直接定义int i = 10;即为常量
2、接口中的常量必须进行赋值,不能不赋值。
3、接口当中的常量名称,使用完全大写的字母,用下划线进行分隔。
public interface MyInterfaceConst{
//其实就是常量,一旦赋值不可以修改。
public static final int NUM_OF_MY_CLASS = 12;
//在ideal中上面的public static final 是灰色字体。
}
继承父类实现多个接口
1、接口是没有静态代码块或构造方法的
2、一个类的直接父类是唯一的,但是一个类可以同时实现多个接口
3、如果实现类所实现的多个接口中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
4、如果实现类没有覆盖重写所有接口中所有的抽象方法,那么实现类就必须是一个抽象类。
5、如果实现类所实现的多个接口中,存在重复的默认方法,那么实现类就必须覆盖重写冲突的默认方法。
6、优先级问题,一个类如果直接父类中的成员方法与接口中的默认方法产生了冲突,优先使用父类当中的方法。
接口的继承关系
public interface MyInterface entends MyInterfaceA,MyInterfaceB{
}
接口的继承可以是多继承关系,而类与类之间是单继承的,直接父类只能有一个。
类与接口之间是多实现的,一个类可以实现多个接口。
多个父接口当中的抽象方法如果重复,没关系。
但是如果多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法覆盖重写,而且必须带着default关键字。