欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

12.接口的相关注意事项

程序员文章站 2022-06-15 13:47:06
...
  • Interface.java
public interface Interface {
    // 接口中,没有构造方法,不能创建对象。
    // 接口中,没有静态代码块。static {} 
    
    // 可以定义常量。接口中可以省略public static final这三个关键字
    // 接口中的常量必须的赋值,当然罗,常量嘛,规范大写,下划线;
    public static final int CHANG_LANG = 0;

    // 抽象方法,abstract可以省略,无方法体
    public abstract void method1();

    // 默认方法,default 不可省略,
    // 子类继承或者子类重写,
    // 子类需要能使用 Interface.super.method2()来调用我!
    // 作用:默认方法可以解决接口升级的问题(接口需要添加新功能,如果加抽象方法,之前实现的类都会报错)
    public default void method2() {
        System.out.println("子类可以继承,可以重写");
    }

    // 静态方法,static修饰,供接口直接调用 Interface.method3()。
    public static void method3() {
        System.out.println("这个是静态方法");
    }

    /**================================================*/

    // 私有方法,private修饰,抽离默认方法之间重复的代码
    // 供接口中的默认方法调用
    private void method4() {
        System.out.println("请在接口内用非静态方法使用我这个私有方法");
    }

    // 私有静态方法,private修饰,抽离静态方法之间重复的代码
    // 供接口中的默认方法或者静态方法调用
    private static void method5() {
        System.out.println("请在接口中使用我这个私有方法");
    }

}
  • NoAbs类实现了Interface这个接口
// 使用 implements关键字实现接口
public class NoAbs implements Interface {

    // 非抽象子类实现接口
    //     1.必须重写接口重点所有抽象方法
    //     2.继承了接口的默认方法,可以直接调用,可以重写
    // 子类中重写抽象方法,
    @Override
    public void method1() {
        System.out.println("我实现了接口中的抽象方法");
    }

    // 默认方法的使用,继承or重写,(以重写为栗)
    // 如果想使用在接口中的默认方法,只能通过实现类的对象进行调用
    // 实现类重写默认方法时,不能写default(子接口中重写必须保留)
    @Override
    public void method2() {
        System.out.println("我重写了接口中的方法");
        // super.method2(); 接口实现类中不允许这样写
        Interface.super.method2(); // 实现类中需要这样写,估计是一种语法糖
    }

    // 静态方法的使用,
    //    @.只能使用接口名调用(实现类中也可以使用)
    //    1.不能通过 实现类的 类名 调用
    //         (因为接口是支持多继承的,有可能父类接口们有重名的静态方法,
    //          而且没有优先级,直接使用类名访问,逻辑上是分不清找那个!,
    //          这也就说明了如果子类继承的父类有同名的默认方法,必须得重写一次。)
    //    2.不能通过 实现类的 对象 调用
    public void mydelfMethod1() {
         Interface.method3();
         // super.method3(); 接口实现类中不允许这样写
    }
}
  • Interface2接口
public interface Interface2 {

    void method1();

    default void method2() {
        System.out.println("我和第一个接口的默认方法重名了,哈哈");
    }

    public static void method3() {
        System.out.println("我是接口2中的静态方法, 和第一个重名了");
    }

    void method22(String s);
}
  • noAbs2类实现了Interface接口和Interface2接口
// 接口的多实现
public class noAbs2 implements Interface, Interface2{

    // 有多个抽象方法时,实现类必须重写所有的抽象方法
    // 如果没有将抽象方法实现完,那么此实现类必须是一个抽象类!
    // 如果抽象方法有重名的,只需要重写一次
    @Override
    public void method1() {
        System.out.println("两个接口有重复的抽象方法,实现一个就够了");
    }

    @Override
    public void method22(String s) {
        System.out.println("实现的第二个接口的抽象方法");
    }

    // 接口中,有多个默认方法,实现类都可以继承使用。
    // 如果继承的接口们中的默认方法有重名冲突的,必须重写一次!!
    // 对于各个接口,没有啥调用优先级。
    public void method2() {
        System.out.println("由于我实现的两个抽象类中有重名的方法,我必须重写一次。");
    }

    // 静态方法,接口中,存在静态方法同名不会冲突 Interface.methods();

    // 父类和实现接口的优先级的问题:
    // 当一个类,既继承了一个父类,又实现若干个接口,
    // 父类中的成员方法与接口中的默认方法重名,
    // 子类就行选择执行父类的成员方法。
}

接口与接口之间的多继承

  • Interface3接口继承了Interface接口和Interface2接口
public interface Interface3 extends Interface, Interface2 {

    /** 接口的多继承,一个接口能继承一个或者多个接口,
    * 同样用extends关键字,子接口继承父接口的方法*/

    // 子接口重写默认方法,default关键字需保留(实现类中重写默认方法,不能写default)
    // 如果父接口们中的默认方法有重名的,子接口需要重写一次,也就是说接口的多继承有没有啥优先级可分。
    @Override
    default void method2() {
        System.out.println("重写默认方法");
    }

    // 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用 public static final修饰
    public static final String Du = "Do";

}