接口就是一种公用的规范标准。只要符合规范就可以大家通用。
在代码中接口就是多个类的公共规范
接口是一种引用数据类型,最重要的内容就是其中的抽象方法
如何定义一个接口的格式:
public interface 接口名称{
// 接口内容
}
备注:换成了关键字interface之后,编译生成的字节码文件仍然是:.java(源文件) ——> .class
如果是Java 7,那么接口中可以包含的内容有:
1. 常量
2. 抽象方法
如果是Java 8 ,还可以额外包含有:
3. 默认方法
4. 静态方法
如果是Java 9 ,还可以额外包含有:
5. 私有方法
在任何版本的Java中,接口都能定义抽象方法 。
格式: public abstract 返回值类型 方法名称(参数列表);
注意:
1. 接口当中的抽象方法修饰符必须是两个固定的关键字:public abstract
2. 这两个关键字修饰符可以选择性的省略
3. 方法的三要素可以随意定义
编辑
接口使用步骤:
1. 接口不能直接使用,必须有一个 “ 实现类 ” 来 “ 实现 ” 该接口
格式: public class 实现类名称 implements 接口名称{
// ......
}
2. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
实现:去掉 abstract 关键字,加上方法体大括号 。
3. 创建实现类的对象进行使用
注意:如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。
从Java 8开始接口中允许定义默认方法。
格式: public default 返回值类型 方法名称(参数列表){
方法体
}
备注:接口当中的默认方法可以解决接口升级的问题。
1. 接口的默认方法可以通过接口实现类对象直接调用
2. 接口的默认方法也可以被接口实现类进行覆盖重写
从Java 8开始,接口中允许定义静态方法
接口中静态方法定义的格式: public static 返回值类型 方法名称(参数列表){
// 方法体
}
提示:就是将 abstract 或者 default 换成 static 即可 ,带上方法体。
不能通过接口实现类的对象来调用接口当中的静态方法。
正确用法: 通过接口名称直接调用其中的静态方法
格式: 接口名称 . 静态方法名称(参数列表)
问题描述:需要抽取一个共有方法来解决两个默认方法之间重复代码的问题,但是这个共有方法不应该让实现类使用,应该是私有化的
解决方案:
从java 9 开始,接口当中允许定义私有方法
1. 普通私有方法,解决多个默认方法之间重复代码问题
格式: private 返回值类型 方法名称(参数列表){
// 方法体
}
2. 静态私有方法,解决多个静态方法之间重复代码问题
格式: private static 返回值类型 方法名称(参数列表){
// 方法体
}
如果接口中为了解决重复代码问题定义了一个私有方法,则不可以直接用方法名访问接口中的私有方法,要用接口名. 方法名。
接口当中也可以定义 “ 成员变量 ” ,但是必须使用 public static final 三个关键字进行修饰
从效果上看,这其实就是接口的【常量】,一旦赋值就不可以修改
格式 : public static final 数据类型 常量名称 = 数据值 ;
注意:一旦使用final 关键字进行修饰说明不可以改变
注意事项:
1. 接口中的常量可以省略 public static final ,不写这三个也是常量
2. 接口中的常量必须进行赋值,不能不赋值
3. 接口中常量的名称使用完全大写的字母,用下划线进行分隔(推荐的命名规则)
在Java 9 + 版本中,接口的内容可以有:
1. 成员变量其实是常量,格式:[ public ] [static] [final] 数据类型 常量名称 = 数据值
注意:常量必须进行赋值,而且一旦赋值不能改变,常量名称完全大写,用下划线进行分隔
2. 接口中最重要的就是抽象方法,格式:[public] [abstract] 返回值类型 方法名称(参数列表);
注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。
【这里的接口和实现类的关系有点像父子类关系,只是关键字变了,还有就是一个子类只能有唯一的父类,而一个类可以同时实现多个接口】
3. 从java 8开始,接口里允许定义默认方法,格式:public default 返回值类型 方法名称(参数列表){方法体}
注意:默认方法也可以被覆盖重写
4. 从Java 8 开始,接口里允许定义静态方法,格式:[public] static 返回值类型 方法名称(参数列表){方法体}
注意:应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法
5. 从Java 9 开始,接口里允许定义私有方法,格式:
普通私有方法: private 返回值类型 方法名称(参数列表){ 方法体 }
静态私有方法:private static 返回值类型 方法名称(参数列表){ 方法体 }
注意:private 的方法只有接口自己才能调用,不能被实现类或者别人使用
使用接口的时候需要注意:
1. 接口是没有静态代码块或者构造方法的
2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口
格式:public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {
// 覆盖重写所有的抽象方法
}
3. 如果实现类所实现的多个接口当中存在重复的抽象方法,那么只需要覆盖重写一次即可
4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类
5. 如果实现类所实现的多个接口当中存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
6. 一个类如果直接父类当中的方法和接口当中的默认方法产生了冲突,优先用父类当中的方法(父类的优先级高于接口)
1. 类与类之间是单继承的,直接父类只有一个
2. 类与接口之间是多实现的,一个类可以实现多个接口
3. 接口与接口之间是多继承的
注意:
1. 多个父接口当中的抽象方法如果重复没关系
2. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且要带着 default 关键字