zoukankan      html  css  js  c++  java
  • Java拓展接口-default关键词

      Java接口在使用过程中有两点规定:

      1、接口中只能有定义方法名、方法返回类型,不能有方法的实现。

      2、实现接口的类,必须实现接口中所有的方法。

    例如下面的例子:

    //定义接口
    public interface Action {
      //接口中的方法定义,只能定义返回类型、方法名称
      String say();
    }
    
    //接口的实现
    public class ActionImpl implements Action {
      @Override
      public String say() {
        return "Hello world!";
      }
    }  

    如果在接口中增加一个方法,会出现什么情况?这里增加一个sleep方法。

    public interface Action {
      String say();
      String sleep();
    }
    

     我使用的是idea,在编辑器中已经提示出错了:必须要实现sleep方法。

    基于接口使用规定中的第二点,一般是不能拓展接口的,拓展接口,则所有实现该接口的类都要实现新增加的接口。而实际工作中,根本不可能知道有哪些类实现了该接口,改动将是灾难性的。

    如果确实要拓展接口呢?

    Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。

    default方法是指,在接口中可以定义包含具体实现的方法,这打破了Java之前版本对接口的语法限制。其他实现该接口的类不需要实现新增的default方法,默认就继承了该方法,同时也可以覆盖该方法。这样既拓展了接口,也不影响接口的实现类。

    例如:

    public interface Action {
      String say();
      //使用default关键词,使得接口中可以包含方法体
      public default String sleep() {
        return "I will go to sleep.";
      }
    }

    其实现类不报错了,且已经继承了该方法,可以直接使用该方法。

    public class TestAction {
      public static void main(String[] args) {
        Action action = new ActionImpl();
        System.out.println(action.sleep());
      }
    }

    在实现类中也可以覆盖该方法。

    public class ActionImpl implements Action {
      @Override
      public String say() {
        return "Hello world!";
      }
    
      @Override
      public String sleep() {
        return "sleeping";
      }
    }

    总之,default使得接口可以有定义方法体,子类可以继承和覆盖default方法。可以用于拓展接口。

    更详细的说明见:

    更多详细说明

  • 相关阅读:
    [LOJ 6436][PKUSC2018] 神仙的游戏
    [BZOJ 2653] middle
    [WC2018] 州区划分
    [BZOJ 4556][Tjoi2016&Heoi2016]字符串
    [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)
    [BZOJ 4573][ZJOI 2016]大♂森林
    Problem 2322. -- [BeiJing2011]梦想封印
    [BZOJ 2555] SubString
    [日常] NOIWC2019 冬眠记
    [BZOJ 4036][HAOI2015]按位或
  • 原文地址:https://www.cnblogs.com/leanfish/p/9767773.html
Copyright © 2011-2022 走看看