接口就是一种公共的规范标准. 只要符合规范标准, 就可以大家通用. 接口是一种引用数据类型, 最重要的内容就是其中的[抽象方法] .
如何定义一个接口的格式: public interface 接口名称 {// 接口内容}
备注: 换成了关键字 interface 之后, 编译生成的字节码文件仍然是:.java --> .class.
如果是 Java 7, 那么接口可以包含的内容有:
常量
抽象方法
如果是 Java 8, 那么接口还可以额外包含的内容有:
默认方法
静态方法
如果是 Java 9, 那么接口还可以额外包含的内容有:
私有方法
接口的抽象方法定义
在任何版本的 Java 中, 接口都能定义抽象方法.
格式: public abstract 返回值类型 方法名称(参数列表);
注意事项:
接口当中的抽象方法, 修饰符必须是两个固定的关键字: public abstract
这两个关键字修饰符, 可以选择性的省略.
方法的三要素, 可以随意定义.
- public interface MyInterfaceAbstract {
- // 这是一个抽象方法
- public abstract void methodAbs1();
- // 这也是抽象方法
- abstract void methodAbs2();
- // 这也是抽象方法
- public void methodAbs3();
- // 这也是抽象方法
- void methodAbs4();
- }
接口的抽象方法使用
接口使用步骤:
接口不能直接使用, 必须有一个 "实现类" 来 "实现" 接口.
格式: public class 实现类名称 implements 接口名称 {
- //...
- }
- public interface MyInterfaceAbstract {
- // 这是一个抽象方法
- public abstract void methodAbs1();
- // 这也是抽象方法
- abstract void methodAbs2();
- // 这也是抽象方法
- public void methodAbs3();
- // 这也是抽象方法
- void methodAbs4();
- }
接口的实现必须覆盖重写 (实现) 接口中的所有的抽象方法.
实现: 去掉 abstract 关键字, 加上方法体大括号.
- public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {
- @Override
- public void methodAbs1() {
- System.out.println("这是第一个!");
- }
- @Override
- public void methodAbs2() {
- System.out.println("这是第二个!");
- }
- @Override
- public void methodAbs3() {
- System.out.println("这是第三个!");
- }
- @Override
- public void methodAbs4() {
- System.out.println("这是第四个!");
- }
- }
创建实现类的对象, 进行使用.
- public class Demo01Interface {
- public static void main(String[] args) {
- // 错误写法, 不能直接 new 接口对象使用
- // MyInterfaceAbstract inter = new MyInterfaceAbstract();
- // 创建实现类的对象使用
- MyInterfaceAbstractImpl impl = new MyInterfaceAbstractImpl();
- impl.methodAbs1();
- impl.methodAbs2();
- }
- }
注意事项: 如果实现类并没有覆盖重写接口中所有的抽象方法, 那么这个实现类自己就必须是抽象类.
接口的默认方法定义
从 Java 8 开始, 接口当中允许定义默认方法.
格式: public default 返回值类型 方法名称(参数列表){
? 方法体;
}
备注: 接口当中的默认方法, 可以解决接口升级的问题.
接口的默认方法使用
接口的默认方法, 可以通过接口实现类对象, 直接调用.
接口的默认方法, 也可以被接口实现类进行覆盖重写.
接口的静态方法定义
从 Java 8 开始, 接口当中允许定义静态方法.
格式: public static 返回值类型 方法名称(参数列表){
? 方法体;
}
接口的静态方法使用
注意事项: 不能通过接口实现类的对象来调用接口当中的静态方法.
正确用法: 通过接口名称, 直接调用其中的静态方法.
格式: 接口名称. 静态方法名(参数);
接口的私有方法定义
问题描述: 我们需要抽取一个共有方法, 用来解决两个默认方法之间重复代码的问题. 但是这个共有方法不应该让实现类使用, 应该是私有化的.
解决方案:
从 Java 9 开始, 接口当中允许定义私有方法.
普通私有方法, 解决多个默认方法之间重复代码问题
格式: private 返回值类型 方法名称(参数列表){
? 方法体;
}
静态私有方法, 解决多个静态方法之间重复代码问题.
格式: private static 返回值类型 方法名称(参数列表){
? 方法体;
}
接口的私有方法使用
接口的常量定义和使用
接口当中也可以定义 "成员变量", 但必须使用 public static final 三个关键字进行修饰. 从效果上看, 这其实就是接口的[常量] .
格式: public static final 数据类型 常量名称 = 数据值;
注意事项:
接口当中的常量, 可以省略 public static final, 注意: 不写也照样是这样.
接口当中的常量, 必须进行赋值; 不能不赋值.
接口中常量的名称, 使用完全大写的字母, 用下划线进行分割.(推荐命名规则)
- // 定义
- public interface MyInterfaceConst {
- // 这其实是一个常量, 一旦赋值, 不可以修改.
- public static final int NUM_OF_MY_CLASS =10;
- }
- // 使用
- public class Demo05Interface {
- public static void main(String[] args) {
- // 访问接口中的常量
- System.out.println(MyInterfaceConst.NUM_OF_MY_CLASS);
- }
- }
继承父类并实现多个接口
使用接口时, 需要注意:
接口是没有静态代码块或者构造方法的.
一个类的直接父类是唯一的, 但是一个类可以同时实现多个接口. 格式:
- public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {
- ? // 覆盖重写所有抽象方法
- }
如果实现类所实现的多个接口当中, 存在重复的抽象方法, 那么只需要覆盖重写一次即可.
如果实现类没有覆盖重写所有接口当中的所有抽象方法, 那么实现类就必须是一个抽象类.
如果实现类所实现的多个接口中, 存在重复的默认方法, 那么实现类一定要对冲突的默认方法进行覆盖重写.
一个类如果直接父类当中的方法, 和接口当中的方法产生了冲突, 优先用父类当中的方法.
接口之间的多继承
类与类之间是单继承的, 之间父类只有一个.
类与接口之间是多实现的. 一个类可以实现多个接口.
接口与接口之间是多继承的.
- public interface MyInterfaceA {
- public abstract void methodA();
- public abstract void methodCommon();
- }
- public interface MyInterfaceB {
- public abstract void methodB();
- public abstract void methodCommon();
- }
- public interface MyInterface extends MyInterfaceA, MyInterfaceB {
- public abstract void method();
- }
注意事项:
多个父接口当中的抽象方法如果重复, 没关系.
多个父接口当中的默认方法如果重复, 那么子接口必须进行默认方法的覆盖重写,[而且带着 default 关键字] .
来源: http://www.bubuko.com/infodetail-3493962.html