『Java』接口

1. Java 接口可以包含的内容

  • Java 7

    • 常量
    • 抽象方法
      1. 必须用public abstract修饰,例如public abstract void func();
      2. 可以省略修饰,默认添加public abstract
  • Java 8

    • 默认方法
      public default 返回值类型 函数(参数列表){//可以有方法体}
      一般用于接口升级
    • 静态方法
  • Java 9

    • 私有方法

      解决默认方法重复调用问题,抽取出公共操作
      默认私有方法和静态私有方法

2. 接口的抽象方法

  • 在任何版本的Java中,接口都能定义抽象方法

    public interface MyInterface {
        // 定义一个抽象方法
        // [public] [abstract] 返回值类型 方法名(参数列表);
        public abstract void methodAbs();
    }
    
  • 抽象方法的使用

    1. 接口不能直接使用,必须有一个"实现类"来"实现"该接口

      public class 实现类名称 implements 接口名称{
          // ...
      }
      
    2. 接口的实现类必须覆盖重写(override)接口中所有的抽象方法

    3. 创建实现类的对象进行使用

    public interface MyInterface {
        public abstract void methodAbs();
    }
    // -----------------------------------------------------------------
    public class MyInterfaceImpl implements MyInterface{
        @Override
        public void methodAbs() {
            System.out.println("这是抽象方法");
        }
    }
    // -----------------------------------------------------------------
    public class main {
        public static void main(String[] args) {
            MyInterface obj = new MyIntermaceImpl();
            obj.methodAbs();  // 这是抽象方法
        }
    }
    

    如果实现类并没有重写接口中所有的抽象方法,那么这个实现类必须是抽象类

3. 接口的默认方法

public interface MyInterfaceDefault {
    /*
     * 从Java 8开始,接口可以定义默认方法:
     *      [public] default 返回值类型 方法名(参数列表){
     *          // 方法体
     *      }
     * 【注】接口中的默认方法,可以解决接口升级问题,因为接口添加默认方法时原实现类不用修改
     */
    public default void methodDefaultA(){
        System.out.println("这是默认方法A...");
    }

    public default void methodDefaultB(){
        System.out.println("这是默认方法B...");
    }

    public abstract void methodAbs();

}
// -------------------------------------------------------------
public class MyInterfaceImpl implements MyInterfaceDefault{
    @Override
    public void methodAbs() {
        System.out.println("这是一个抽象方法...");
    }

    @Override
    public void methodDefaultB() {
        System.out.println("这是重写的默认方法B...");
    }
}
// ------------------------------------------------------------
public class main {
    public static void main(String[] args) {
        MyInterfaceImpl obj = new MyInterfaceImpl();
        obj.methodAbs();  // 这是一个抽象方法...
        obj.methodDefaultA();  // 这是默认方法A...
        obj.methodDefaultB();  // 这是重写的默认方法B...
    }
}
  • 接口的默认方法,可以通过接口类实现对象直接调用

  • 接口的默认方法,也可以被接口实现类override重写

4. 接口的静态方法

public interface MyInterfaceStatic {
    /*
     * 从Java 8 开始,接口当中允许定义静态方法
     *      [public] static 返回值类型 方法名(参数列表){
     *          // 方法体
     *      }
     */
    public static void methodStatic(){
        System.out.println("这是一个静态方法...");
    }
}
// --------------------------------------------------------
public class main {
    public static void main(String[] args) {
        // MyInterfaceImpl obj = new MyInterfaceImpl();
        // obj.methodStatic();  // 报错,不能通过接口实现类的对象调用接口中的静态方法

        // 通过接口名称直接调用静态方法
        MyInterfaceStatic.methodStatic();  // 这是一个静态方法...
    }
}

5. 接口的私有方法

从 Java 9 开始,接口中允许定义私有方法,包括:

  • 普通私有方法,解决多个默认方法之间重复代码问题

    private 返回值类型 方法名称(参数列表){
        // 方法体
    }
    
  • 静态私有方法,解决多个静态方法之间重复代码问题

    private static 返回值类型 方法名称(参数列表){
        // 方法体
    }
    

【示例】

public interface MyInterfacePrivate {

    public default void methodDefault() {
        methodCommon();
        System.out.println("这是默认方法...");
    }


    public static void methodStatic() {
        methodCommonStatic();
        System.out.println("这是静态方法...");
    }

    private void methodCommon() {
        System.out.println("这是一个默认公用方法...");
    }

    private static void methodCommonStatic() {
        System.out.println("这是一个默认静态方法");
    }
}
// -------------------------------------------------------------
public class MyInterfaceImpl implements MyInterfacePrivate{

}
// -------------------------------------------------------------
public class main {
    public static void main(String[] args) {
        MyInterfaceImpl obj = new MyInterfaceImpl();
        obj.methodDefault();  // 这是一个默认公用方法...
                              // 这是默认方法...

        MyInterfacePrivate.methodStatic();  // 这是一个默认静态方法
                                            // 这是静态方法...
    }
}

6. 接口中的常量

  • 接口中的成员变量只能是常量,用public static final修饰

    [public] [static] [final] int num = 10;
    

【示例】

public interface MyInterfaceConst {
    public static final int NUM_OF_MY_CLASS = 10;
}
// -----------------------------------------------------------
public class main {
    public static void main(String[] args) {
        System.out.println(MyInterfaceConst.NUM_OF_MY_CLASS);  // 10
    }
}

7. Tips

  • 接口中不能有静态代码块和构造方法
  • 一个类只可以继承一个父类,但是可以同时实现多个接口
  • 如果所实现的多个接口中,存在重复的抽象方法,只需override一次即可;若实现类是抽象类,则可以不用重写
  • 如果实现类没有重写所有抽象方法,则实现类必须是抽象类
  • 如果实现的多个接口中,有重复的默认方法,此时必须要重写,消除二义性,即使实现类是抽象类,也要重写
  • 一个类,如果其直接父类方法和接口中默认方法冲突,优先使用父类中方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值