• 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 {
}
//万能手机,既要实现对讲机接口又要实现手机接口
public class UniversalPhone implements IInterphone,IPhone {
@Override
public void communication() {
IInterphone.super.communication();
}
}
  • 4.总结

  • 1.类胜于接口。如果在继承链中有方法体或者抽象的方法声明,那么就可以忽略接口的定义的方法
  • 2.子类胜于父类。如果一个接口继承了另一个接口,且两个接口都定义了一个默认方法,那么子类中定义的方法胜出

Java 8函数编程轻松入门(三)默认方法详解(default function)的更多相关文章

  1. “全栈2019”Java第六十五章:接口与默认方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  3. Java 8函数编程轻松入门

    函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...

  4. java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问

    本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...

  5. PHP实现链式操作的三种方法详解

    这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...

  6. Java 8函数编程轻松入门(四)方法引用

    C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...

  7. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  8. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  9. Java实现数组去除重复数据的方法详解

    一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer ...

随机推荐

  1. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  2. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  3. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  4. .net windows Kafka 安装与使用入门(入门笔记)

    完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS   在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...

  5. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  6. iOS逆向工程之App脱壳

    本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解 ...

  7. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  8. 张高兴的 UWP 开发笔记:横向 ListView

    ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...

  9. Mybatis批量删除

    <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id i ...

  10. 关于HTML语义化的一些理解

    语义化这个词我想大家都看到了无数次,特别是在一些招聘广告上. 其实我自己也是,不过每次看到都觉得是那些招聘公司复制的,其实他们根本说不清语义化是什么,而且也根本不看重. 所以我一直也没把这东西当回事过 ...