总概

JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性。

Java8 新特性列表如下:

  • 接口默认方法
  • 函数式接口
  • Lambda 表达式
  • 方法引用
  • Stream
  • Optional 类
  • Date API
  • Base64
  • 重复注解与类型注解

接下来乐字节将会带大家一一讲以上Java8新特性详细讲解,作为Java8新特性系列文章连载。

一、借口默认方法

1、什么是接口默认方法

从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且Java8提供了很多对应的接口默认方法。

2、设计接口默认方法好处

使用接口编程的好处是,开发是面向抽象而不再是面向具体来编程,使得程序变得很灵活,缺陷是,当需要修改接口时候,此时对应需要修改全部实现该接口的类,举个例子, java 8 之前对于我们常用的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。从Java8开始,引入了接口默认方法,这样的好处也是很明显的,首先解决了Java8以前版本接口兼容性问题,同时对于我们以后的程序开发,也可以在接口子类中直接使用接口默认方法,而不再需要再各个子类中各自实现响应接口方法。

3、默认方法编写

jdk8中接口可以包含实现方法,需要使用default修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中可以按需重写。默认方法只能在实现类中或通过实现类对象调用。注意:当多个父接口中存在相同的默认方法时,子类中以就近原则继承。

public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
}
}

  

4、静态方法

静态方法即通过static 修饰的方法。接口中静态方法页也必须实现,提供了可以直接通过接口调用方法的方式。

public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
} /**
* 定义静态默认方法
*/
static void version(){
System.out.println("这是1.0版简易计算器");
}
}

  

5、接口默认方法使用

5.1 定义IMathOperation 接口 并提供默认打印方法

 public interface IMathOperation {

  /**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
} /**
* 定义静态默认方法
*/
static void version(){
System.out.println("这是1.0版简易计算器");
} /**
* 整数加法运算方法
* @param a
* @param b
* @return
*/
public int add(int a,int b);
}

  

5.2 子类实现

定义MathOperationImpl子类 实现IMathOperation 接口

这里可以看到,在实现IMathOperation 接口时可以选择实现 ( 也可以不实现 ,在子类方法中直接使用 ) 接口默认方法。

public class MathOperationImpl implements  IMathOperation {
@Override
public int add(int a, int b) {
// 子类中可以直接调用父类接口默认方法
IMathOperation.super.print();
// 调用父类静态默认方法
IMathOperation.version();
return a+b;
}
}

  

5.3 多个默认方法情况

使用Java8开发应用程序,子类实现多个接口时,对于接口默认方法定义可能会出现多个默认方法,并且接口默认方法可能会出现同名情况,此时对于子类在实现或者调用时通常遵循以下原则:
1.类中的方法优先级最高
2.如果第一条无法进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体

示例代码如下:

/**
* 定义手机接口 提供默认info方法
*/
public interface Phone {
default void info(){
System.out.println("这是一部手机");
}
} /**
* 定义MiPhone子接口 并继承 Phone 父接口 同时也提供info方法
*/
public interface MiPhone extends Phone{
default void info(){
System.out.println("这是一部小米手机");
}
} /**
* 实现 Phone MiPhone 接口
*/
public class M2sPhone implements Phone,MiPhone { public static void main(String[] args) {
new M2sPhone().info();
}
}

  

打印结果:

这是一部小米手机

这是乐字节Java8新特性连载之一,后面还有之二,之三,欢迎关注。欢迎转载,但请注明文章出处

乐字节-Java8新特性-接口默认方法的更多相关文章

  1. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  2. Java8新特性——接口默认方法

    Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为什么要有这个特性? 首先 ...

  3. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  4. 乐字节-Java8新特性之Base64和重复注解与类型注解

    上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...

  5. Java8新特性系列-默认方法

    Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...

  6. 乐字节-Java8新特性之方法引用

    上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...

  7. 乐字节-Java8新特性之函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  8. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

  9. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

随机推荐

  1. 重置identity值

    如果数据库在SQL2008或以上,可以参考下面方法: DBCC CHECKIDENT ( table_name [, { NORESEED | { RESEED [, new_reseed_value ...

  2. git 下载指定tag版本的源码

    git clone --branch x.x.x https://xxx.xxx.com/xxx/xxx.git

  3. 201621123018《java程序设计》第11周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  4. Html 常见meta

    html 的meta标签对网页渲染及SEO搜索引擎起着不可忽视的作用.详细的写法一段时间不写,容易忘,所以整理了一下,方便需要时查看. <!DOCTYPE html> <!-- 使用 ...

  5. c++三维静态数组的定义与作为函数的传递

    在c++中,我们可以定义三维数组,并且可以将之作为参数直接传递. 定义: #include <iostream> #include <windows.h> using name ...

  6. Ubuntu 安装配置最新版 PostgreSQL

    环境:Ubuntu Xenial (16.04)     !!! CentOS 参考这里 #安装 PostgreSQL sudo apt-get updatesudo apt-get upgradea ...

  7. 使用binlog2sql针对mysql进行数据恢复

    MySQL闪回原理与实战 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法 ...

  8. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  9. 《第一本Docker书》

    Docker简介 Docker依赖写时复制(copy-on-write),使修改应用程序非常迅速. Docker推荐单个容器只运行一个应用或进程,鼓励面向服务的架构和微服务架构. Docker的核心组 ...

  10. PHP之高性能I/O框架:Libevent(一)

    Libevent 是一个用C语言编写的.轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O, ...