Java秘技之拓展接口-default关键词

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

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

例如下面的例子:

//定义接口
public interface Action {
  //接口中的方法定义,只能定义返回类型、方法名称
  String say();
}
 
//接口的实现
public class ActionImpl implements Action {
  @Override
  public String say() {
    return "Hello world!";
  }
}  //加入Java开发交流君样:756584822一起吹水聊天

如果在接口中增加一个方法,会出现什么情况?这里增加一个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.";
  }
}//加入Java开发交流君样:756584822一起吹水聊天

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

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!";
  }
 //加入Java开发交流君样:756584822一起吹水聊天
  @Override
  public String sleep() {
    return "sleeping";
  }
}

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

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值