Java 8函数编程轻松入门(三)默认方法详解(default function)
default出现的原因
- Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容。
- 在Java 8中为Collection接口增加了stream方法,这意味着所有实现Collection接口的类都必须实现stream方法。这时候问题在于:核心自带的类能轻松在JDK实现,但是如果是我们平时自定义的集合类,我们是否需要一个一个的去修改代码?
- Java 8为了解决这个问题,在Java 8中添加新的语言特性:默认方法
1.默认方法(default)
- 这时候给Collection接口的stream方法前面加上default。代表:如果实现的Collection的类没有实现stream的子类,就是使用接口的里面的方法。
- 注意:
- default的修改的方法是拥有方法体的
//定义一个函数接口
@FunctionalInterface
public interface Speak {
void say(String msg);
default void haha() {
System.out.println("hahahaha...");
}
}
public class SpeakEnglish implements Speak {
@Override
public void say(String msg) {
System.out.println("How are your!");
}
}
- 1.这时候SpeakEnglish类并没有实现Speak接口的haha方法,依然可以编译通过。
- 2.SpeakEnglish的实例依然可以调用Speak接口的haha方法,并且可以输出hahaha...
默认方法和子类
public interface IParent {
public void message(String msg);
public default void welcome(){
message("Parent:Hi!");
}
}
public interface IChild extends IParent {
@Override
default void welcome() {
message("Child:Hi!");
}
}
- 那么IChild的实现类的调用的welcome方法是显示什么呢?
- 答:显示的Child:Hi
- 原因:类中重写的方法胜出,增加默认方法主要是解决在接口上向后兼容,让类中的重写的方法的优先级高于默认方法能简化很多继承问题
3.多重继承
- 在我们的认知中,接口是允许多重继承,因此有可能碰到两个接口包含签名相同的默认的方法的情况。这时候我们该怎么解决?
//手机接口
public interface IPhone {
default void communication(){
System.out.println("使用手机进行通讯...");
}
}
//对讲机接口
public interface IInterphone {
default void communication(){
System.out.print("使用对讲机进行通讯...");
}
}
//万能手机,既要实现对讲机接口又要实现手机接口
public class UniversalPhone implements IInterphone,IPhone {
}
- 上述的代码是无法编译通过的。因为javac并不明确应该继承哪个接口的方法,因此编译器报错( http://stackoverflow.com/questions/2598009/method-name-collision-in-interface-implementation-java)
- 解决方案:
- 使用增强的Super语法,用来指明使用哪个接口的定义的默认方法
//万能手机,既要实现对讲机接口又要实现手机接口
public class UniversalPhone implements IInterphone,IPhone {
@Override
public void communication() {
IInterphone.super.communication();
}
}
4.总结
- 1.类胜于接口。如果在继承链中有方法体或者抽象的方法声明,那么就可以忽略接口的定义的方法
- 2.子类胜于父类。如果一个接口继承了另一个接口,且两个接口都定义了一个默认方法,那么子类中定义的方法胜出
Java 8函数编程轻松入门(三)默认方法详解(default function)的更多相关文章
- “全栈2019”Java第六十五章:接口与默认方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- Java 8函数编程轻松入门
函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...
- java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问
本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...
- PHP实现链式操作的三种方法详解
这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...
- Java 8函数编程轻松入门(四)方法引用
C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...
- Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...
- Java 8函数编程轻松入门(五)并行化(parallel)
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
- Java实现数组去除重复数据的方法详解
一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- boosting、adaboost
1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- C#与C++的发展历程第三 - C#5.0异步编程巅峰
系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- SASS教程sass超详细教程
SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
- ASP.NET MVC开发日常一:SessionID合理清除
在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...