概述

Java 8中,你可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念。猜想设计初衷可能使为了兼容8以下的jdk Java8出来了个函数式接口,只要声明成函数式接口的接口都只能有一个抽象方法,为了便于扩展,赋予接口这么一个新特性

静态方法:使用 static 关键字修饰。可以通过接口直接调用静态方法,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。你可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。

默认方法:默认方法使用 default 关键字修饰。可以通过实现类对象来调用。我们在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。

比如:java 8 API中对Collection、List、Comparator等接口提供了丰富的默认方法。

接口默认方法的类优先原则

若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时

选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。

看例子:


package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午3:56:46
*/
public interface Myfun {
//新增了默认方法 有方法体了
default String getName() {
return "return "接口中的getName方法";
}
//还可以写静态方法
public static void show() {
System.out.println("Java8接口中的静态方法");
}
} package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午3:59:20
*/
public class Myclass {
public String getName() {
return "类中的getName()方法";
}
} package com.xnn.newInterface; /**
* 类(接口)描述:既继承 又实现 遵循类优先原则
* @author xnn
* 2018年10月25日下午4:00:29
*/
public class MYsubClass extends Myclass implements Myfun { }
package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午4:01:41
*/
public class TEst {
public static void main(String[] args) {
MYsubClass class1 = new MYsubClass();
//调类里面的方法
System.out.println(class1.getName());
Myfun.show();
}
}

结果

类中的getName()方法
Java8接口中的静态方法

接口冲突

如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么实现类必须覆盖该方法来解决冲突

例子:


package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午3:56:46
*/
public interface Myfun {
//新增了默认方法 有方法体了
default String getName() {
return "接口中的getName方法";
}
//还可以写静态方法
public static void show() {
System.out.println("Java8接口中的静态方法");
}
} package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午4:03:45
*/
public interface MyInterface {
default String getName() {
return "MYin接口"
;
}
} package com.xnn.newInterface; /**
* 类(接口)描述:
* @author xnn
* 2018年10月25日下午3:59:20
*/
public class Myclass {
public String getName() {
return "类中的getName()方法";
}
} package com.xnn.newInterface; /**
* 类(接口)描述:实现两个接口时 必须指定一个来解决冲突
* @author xnn
* 2018年10月25日下午4:00:29
*/
public class MYsubClass implements Myfun,MyInterface { @Override
public String getName() {
// TODO Auto-generated method stub
return Myfun.super.getName();
} }

Java8接口新特性的更多相关文章

  1. java8的新特性以及用法简介

    1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predic ...

  2. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  3. 简单了解JAVA8的新特性

    JAVA8新特性会颠覆整个JAVA程序员的编程习惯 甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解 所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性 ...

  4. Java8常用新特性实践

    前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...

  5. Java 接口 新特性(Java8)

    Java8新特性之接口增强 在Java7以及以前的版本中,接口里的方法都是抽象的,并且不存在静态方法,属性默认修饰符是public static final.所有方法的声明都是public [返回类型 ...

  6. Java8的新特性以及与C#的比较

    函数式接口 VS 委托 在C中,可以使用函数指针来存储函数的入口,从而使得函数可以像变量一样赋值.传递和存储,使得函数的调用变得十分灵活,是实现函数回调的基础.然而函数指针不存在函数的签名信息,甚至可 ...

  7. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  8. Java8部分新特性的学习

    Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它 ...

  9. java7与java8的新特性

    java7 新特性: 1. switch 里面的 case 条件可以使用字符串了. 2. 运用 List\tempList = new ArrayList<>(); 即泛型实例化类型自动判 ...

随机推荐

  1. weblogic解决jar包冲突

    前言 在项目中利用POI开发excel.word的导入导出功能,而POI在解析xlsx及docx两种高版本文档时需要依赖xmlbeans包,但weblogic容器中提供了低版本的xmlbeans,从而 ...

  2. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  3. Linux 部署 FastDFS

    FastDFS 安装规划: 项目 信息 Group Name group1 FastDFS安装主目录 /usr/local/fastdfs-5.0.8 FastDFS work主目录 /usr/loc ...

  4. JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出

    这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...

  5. CentOS7升级OpenSSL版本

    1.CentOS7.6默认安装的openssl版本为 # 查看openssl版本 openssl version 2.下载最新的openssl wget https://www.openssl.org ...

  6. Linux系统:centos7下搭建Nginx和FastDFS文件管理中间件

    本文源码:GitHub·点这里 || GitEE·点这里 一.FastDFS简介 1.基础概念 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件上传 ...

  7. ASP.NET Core 2.2 WebApi 系列【五】MiniProfiler与Swagger集成

    MiniProfiler 是一款性能分析的轻量级程序,可以基于action(request)记录每个阶段的耗时时长,还是可以显示访问数据库时的SQL(支持EF.EF Code First)等 一.安装 ...

  8. ThinkPHP中框架查询

    1.查询多条数据          1.1静态调用all方法或者select方法 // 获取所有数据 all 和 select $list = User::all(); // 根据主键获取多个数据al ...

  9. jmap 导出 tomcat 内存快照分析

    登录系统(注意这里启动 tomcat 的用户) # 获取 tomcat 的 pid 号 ps -ef|grep tomcat # 例如这里 pid 号为 13133 jmap -dump:live,f ...

  10. opencv-python 图像处理(五)

    Canny边缘检测 1) 使用高斯滤波器,以平滑图像,滤除噪声. 2) 计算图像中每个像素点的梯度强度和方向. 3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测 ...