zoukankan      html  css  js  c++  java
  • 【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");
        }
    }

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

    万丈高楼平地起。
  • 相关阅读:
    领域驱动设计概览
    淘宝大秒系统设计详解
    如何设计测试用例
    MySQL性能优化
    Nginx 负载均衡
    智慧园区该怎么建设
    Docker容器完整使用教程
    C#框架结构分层
    项目验收PPT
    这么少的字,也能做出这么好看的PPT
  • 原文地址:https://www.cnblogs.com/jcl226/p/13138344.html
Copyright © 2011-2022 走看看