接口(默认方法,静态方法,私有方法)

  • 接口的组成
  • 常量
  • public static final
  • 抽象方法
  • public abstract
  • 默认方法(Java 8) (新增)
  • 静态方法(Java 8) (新增)
  • 私有方法(Java 9) (新增)
  • 解析
  • default
  • static
  • private
  • 再谈接口组成

1_接口中默认方法【应用】

  • 接口默认方法的意义
  • 方便接口扩展功能,而不影响原有实现类
  • 接口中默认方法的定义格式:
    格式:
public default 返回值类型 方法名(参数列表) {   }
  • public可以省略,default不能省略
  • 接口中默认方法的注意事项
    默认方法不是抽象方法,所有有方法体,也就是有具体的实现。
    默认方法不是抽象方法,所以不强制实现类去重写。
    实现类可以重写接口默认方法,重写的时候去掉default关键字,也可以直接使用接口默认方法。
  • 解析
  • default方法的好处?
    解耦,不要求所有实现类重写default方法
  • 代码演示
/**
 * 包含默认方法的接口
 */
public interface IInter {
    void eat();
    void jump();
    default void fly() {
        System.out.println("飞...");
    }
}


/**
 * 实现默认方法接口类
 */
public class Cat implements IInter {
    @Override
    public void eat() {
        System.out.println("吃鱼...");
    }

    @Override
    public void jump() {
        System.out.println("跳树...");
    }

    //重写默认方法
    @Override
    public void fly() {
        System.out.println("会飞的机器猫...");
    }
}
  • 练习(10分钟)
  • 定义一个IInter接口,有两个抽象方法,eat(),jump()
  • 定义两个类Cat,Bird去实现该IInter接口
  • 接口增加default方法fly()
  • Bird对象直接调用默认方法
  • Cat重写默认方法

2_接口中静态方法【应用】

  • 接口中静态方法的定义格式:
    格式:
public static 返回值类型 方法名(参数列表) {   }
  • 接口中静态方法的注意事项
  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
  • public可以省略,static不能省略
  • 代码演示
public interface Eatable {
    void eat();
    //接口静态方法
    static void method() {
        System.out.println("接口的静态方法...");
    }
}


/**
 * 接口中静态方法
 */
public class MainClass {
    public static void main(String[] args) {
        Cat cat = new Cat();
        //实现接口的对象无法调用接口静态方法
        //cat.method();
        //接口静态方法的调用需要使用接口
        Eatable.method();
    }
}
  • 练习(10分钟)
  • 在接口中定义静态方法
  • 尝试实现类调用
  • 尝试实现类对象调用
  • 尝试接口调用

3_接口中私有方法【应用】

  • 接口中私有方法的定义格式:
    格式1:
private 返回值类型 方法名(参数列表) {   }

格式2:

private static 返回值类型 方法名(参数列表) {   }
  • 接口中私有方法的注意事项
  • 默认方法可以调用私有的静态方法和非静态方法
  • 静态方法只能调用私有的静态方法
  • 解析
  • 私有方法不能被外部访问,为什么还需要私有方法?
  • 复用,易维护
  • 代码演示
public interface Inter {
    //私有方法
    private static void privateShow() {
        System.out.println("这里的大山不一般,有花有草我喜欢。");
        System.out.println("有花有草我喜欢啊,这里的大山不一般!");
    }

    //默认方法
    default void defaultShow() {
        System.out.println("defaultShow开始");
        //使用接口私有方法
        privateShow();
        System.out.println("defaultShow结束");
    }

    //静态方法
    static void staticShow() {
        System.out.println("defaultShow开始");
        //使用接口私有方法
        privateShow();
        System.out.println("defaultShow结束");
    }
}