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方法。可以用于拓展接口。

更详细的说明见:

更多详细说明

Java拓展接口-default关键词的更多相关文章

  1. spring源码分析系列 (3) spring拓展接口InstantiationAwareBeanPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.InstantiationAwareBeanPostProcessor简述与demo示例 二.InstantiationAwareBean ...

  2. spring源码分析系列 (2) spring拓展接口BeanPostProcessor

    Spring更多分析--spring源码分析系列 主要分析内容: 一.BeanPostProcessor简述与demo示例 二.BeanPostProcessor源码分析:注册时机和触发点 (源码基于 ...

  3. JAVA 函数式接口与c#委托对应关系(一)

    C# Action委托 VS JAVA Action 接口函数 1.c#:Action 封装一个方法,该方法不具有参数并且不返回值. 构造实体类类 using System; namespace Ac ...

  4. node作为中间层 —> 跨域请求java后台接口(使用http-proxy-middleware中间件)

    情景:利用node的express 作为中间层,跨域调取java后台接口,由于java接口对session有判断,因此每次请求都必须在req的headers中需要带上cookie,否则接口报500错误 ...

  5. spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor简述与demo示例 ...

  6. Java 8 接口中的默认方法与静态方法

    Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...

  7. jdk1.8新特性之接口default方法

    众所周知,default是java的关键字之一,使用场景是配合switch关键字用于条件分支的默认项.但自从java的jdk1.8横空出世以后,它就被赋予了另一项很酷的能力——在接口中定义非抽象方法. ...

  8. java嵌套接口

    java嵌套接口 package object; class A { //嵌套在类中的接口,可以被private,protected,default和public四种权限修饰 interface B ...

  9. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

随机推荐

  1. 以太坊智能合约 Solidity 的常用数据类型介绍

    目录 目录 1.数组 1.1.对数组的增删改查操作. 2.String.Bytes.Mapping的使用 3.Enums 和 Structs 的简单应用 4.Ether 单位和 Time 单位 5.A ...

  2. Dubbo开发,利用项目模拟提供者和消费者之间的调用--初学

    开发工具:IDEA,虚拟机 VMware Workstation 预备工作:安装好zookeeper的虚拟机,电脑jdk更换为1.7,本地tomcat启动,能够访问以下页面即可进行开发 2.建立以下s ...

  3. Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法

    通常项目上线前都有一些初始化数据需要导入,在今天博客系统发布前我使用sqlyog工具远程登录服务器的Mysql数据库,执行sql脚本对初始数据进行导入的时候报错: Got a packet bigge ...

  4. Threading.Timer用法

    protected System.Threading.Timer executeTimer;//定时器 private int interval;//定时器执行间隔周期 executeTimer = ...

  5. Linux Mysql数据库安全配置

    Linux  Mysql数据库安全配置 目录: 1.修改mysql管理员账号root的密码(2种方法) 2.修改mysql管理员账号root 3.mysql管理员root账号密码遗忘解决办法(2种方法 ...

  6. windows10 1903 64位系统

    近日,微软完成并开始推送Windows 10 2019年的第一个重大升级的预览版本,版本号是v1903,命名则是2019年5月更新版. 点击下载windows10

  7. Vue学习之路2-项目初搭建

    1.检查环境是否全部安装成功 2.创建项目 2.1.打开dos命令窗口,使用dos命令转到项目文件夹下: 2.2.输入创建项目命令:vue init webpack myproject1 创建不同的打 ...

  8. Spark中的一些概念

    最近工作用到Spark,这里记一些自己接触到的Spark基本概念和知识. 本文链接:https://www.cnblogs.com/hhelibeb/p/10288915.html 名词 RDD:在高 ...

  9. Configuring Apache Kafka Security

    This topic describes additional steps you can take to ensure the safety and integrity of your data s ...

  10. Cloudera Manager和CDH5.8离线安装

    https://blog.csdn.net/zzq900503/article/details/52982828 简介 我们在上篇文章中已经了解了CDH,为了后续的学习,我们本章就来安装CDH5.8. ...