【Java基础】接口(2):接口中默认/静态/私有方法的定义、使用

从Java 8开始,接口中允许定义默认方法、静态方法

 一、接口中默认方法的定义、使用

【默认方法格式】:

  public default 返回值类型 方法名称 (参数列表){

    方法体

  }

接口当中的默认方法,可以解决接口升级的问题。(后期还有新的用法)

  场景:当接口中新增抽象方法时,因为实现类需要覆盖重写(实现)接口中所有的抽象方法,否则会报错,如果一个个的手动去重写方法,搁谁都不乐意吧,哈哈哈。

  解决途径:新增方法时,改为默认方法,则无需在实现类中挨个重写该新增方法

  

【默认方法定义、使用】:

  1、接口中定义默认方法

public interface MyInterfaceDefault {
    //抽象方法
    public abstract void methodAbs();
    //接口中新增抽象方法时,实现类会报错
    //public abstract void methodAbs2();

    //新添加方法时,解决途径:改成默认方法
    public default void methodDefault(){
        System.out.println("这是新添加的默认方法");
    }
}

  2、定义了两个实现类

public class MyInterfaceDefaultA implements MyInterfaceDefault{
    @Override
    public void methodAbs() {
        System.out.println("实现了抽象方法,AAA");
    }

}

  可以看到,上图实现类只重写了一个抽象方法,对于新增的默认方法并未重写;

public class MyInterfaceDefaultB implements MyInterfaceDefault{
    @Override
    public void methodAbs() {
        System.out.println("实现了抽象方法,BBB");
    }

    @Override
    public void methodDefault() {
        System.out.println("实现类B对默认方法进行了覆盖重写");
    }

}

  第二个实现类对默认方法也进行了重写;

  3、使用接口的默认方法

/*
1、接口的默认方法,可以通过接口实现类的对象直接调用
2、接口的默认方法,也可以被接口实现类覆盖重写
 */
public class Demo02Interface {

    public static void main(String[] args) {
        //创建实现类对象
        MyInterfaceDefaultA a = new MyInterfaceDefaultA();
        a.methodAbs();//实现了抽象方法,AAA

        //调用默认方法,如果实现类中没有,会向上找接口
        a.methodDefault();//这是新添加的默认方法

        MyInterfaceDefaultB b = new MyInterfaceDefaultB();
        b.methodAbs();//实现了抽象方法,BBB
        b.methodDefault();//实现类B对默认方法进行了覆盖重写
    }
}

  第一个实现类中没有默认方法,此时会向上找到接口的默认方法,同样可以调用成功;

  第二个实现类中对默认方法进行了重写,通过实现类对象直接调用;

 

二、接口中静态方法的定义、使用

【静态方法格式】:

  public static 返回值类型 方法名称 (参数列表){

    方法体

  }

【静态方法定义、使用】:

  1、接口中定义一个静态方法

public interface MyInterfaceStatic {

    public static void mehtodStatic(){
        System.out.println("这是接口的静态方法!");
    }
}

  2、接口中静态方法的使用(这里可以参考类名称.静态方法)

public class Demo03Interface {
    public static void main(String[] args) {
        /*错误写法:
        不能通过实现类的对象调用静态方法
        MyInterfaceStaticImpl impl = new MyInterfaceStaticImpl();
        impl.mehtodStatic();
        */

        //正确用法:通过接口名称.静态方法名
        MyInterfaceStatic.mehtodStatic();//这是接口的静态方法!
    }
}

 

三、接口中私有方法的定义、使用

【私有方法定义、使用】:

从Java 9开始,接口当中允许定义私有方法。

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

格式:
  private 返回值类型 方法名称 (参数列表){
    方法体
  }
2、静态私有方法:解决多个静态方法之间重复代码问题
格式:
  private static 返回值类型 方法名称 (参数列表){
    方法体
  }

案例说明:当我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。

  示例:

public interface MyInterfacePrivate {

    public default void methodDefault1() {
        System.out.println("默认方法1");
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }

    public default void methodDefault2() {
        System.out.println("默认方法2");
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }

}

  代码改造1.0:

public interface MyInterfacePrivate {

    public default void methodDefault1() {
        System.out.println("默认方法1");
        methodCommon();
    }

    public default void methodDefault2() {
        System.out.println("默认方法2");
        methodCommon();
    }
    
    public default void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }
}

  发现问题:通过改造,避免了代码重复,但同时又可以发现新增共有方法是public,那实现类同样可以访问该方法,不大合理。

  解决途径:这个共有方法不应该让实现类使用,应该是私有化的。

  代码改造2.0

public interface MyInterfacePrivateA {

    public default void methodDefault1() {
        System.out.println("默认方法1");
        methodCommon();
    }

    public default void methodDefault2() {
        System.out.println("默认方法2");
        methodCommon();
    }

    private void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }
}

  此时共有方法为私有,实现类不能直接访问,问题解决!

posted @ 2020-06-15 22:40  蹲马路牙子吃炒面  阅读(781)  评论(0编辑  收藏  举报