默认方法允许接口方法定义默认实现,子类方法不必须实现此方法而就可以拥有该方法及实现。如下:

public interface DefaultFuncInter {

int getInt();

default String getString(){

return "Default String";

}

}

默认方法的优势

默认方法主要优势是提供了一种扩展接口的方法,而不破坏现有代码。如果一个已经投入使用的接口需要扩展一个新的方法,在JDK8以前,我们必须再该接口的所有实现类中都添加该方法的实现,否则编译会出错。如果实现类数量很少且我们有修改的权限,可能工作量会少,但是如果实现类很多或者我们没有修改代码的权限,这样的话就很难解决了。而默认方法提供了一个实现,当没有显式提供时就默认采用这个实现,这样新添加的接口就不会破坏现有的代码。

默认方法另一个优势是该方法是可选的,子类可以根据不同的需求而且经override或者采用默认实现。例如我们定义一个集合几口,其中有增、删、改等操作,如果我们的实现类90%都是以数组保存数据,那么我们可以定义针对这些方法给出默认实现,而对于其他非数组集合或者有其他类似业务,可以选择性复写接口中默认方法。(由于接口不允许有成员变量,所以本示例旨在说明默认方法的优势,并不具有生产可能性)具体参照如下代码:

/**

* 定义接口,并包含默认实现方法

*/

public interface CollectionDemoInter {

//增加默认实现

default void addOneObj(Object object){

System.out.println("default add");

}

//删除默认实现

default void delOneObj(Object object){

System.out.println("default del");

}

//更新默认实现

default void updateOneObj(Object object){

System.out.println("default del");

}

//接口定义需要实现方法

String showMsg();

}

/**

* 基于数组的集合实现类,增删改使用默认方法

*/

public class Collection4Array implements CollectionDemoInter {

@Override

public String showMsg() {

return null;

}

}

/**

* 特殊集合,不允许删除元素

*/

public class NodelCollection implements CollectionDemoInter {

@Override

public String showMsg() {

return null;

}

@Override

public void delOneObj(Object object){

System.out.println("none del");

}

}

通过上述代码,大家可以很清楚的发现,如果在接口中定义默认方法,则子类不需要必须实现该默认实现,如果有特殊需求或者需要,则可以Override该实现。

需要注意

如果一个类实现两个或两个以上接口,并且多个接口中包含统一默认方法,此时,编译器将报错。这种情况,我们必须让子类Override该方法,否则无法编译通过。

在所有的情况,类实现的优先级高于接口的默认实现,也就是先使用自己类中定义的方法或者是父类中的方法。

如果是一个接口继承了另外一个接口,2个接口中也包含相同的默认方法,那么继承接口的版本具有更高的优先级。比如A扩展了B接口,那么优先使用A类里面的test方法。

通过使用super,可以显式的引用被继承接口的默认实现,语法如下:InterfaceName.super.methodName()。

接口中的静态方法

java8中为接口新增了一项功能:定义一个或者更多个静态方法。类似于类中的静态方法,接口定义的静态方法可以独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实例,也就是说和调用类的静态方法的方式类似。语法如:接口名字.静态方法名。

interface A

{

static String getName()

{

return "接口A。。。";

}

}

public class Test implements A

{

public static void main(String[] args)

{

System.out.println(A.getName());

}

}

注意,实现接口的类或者子接口不会继承接口中的静态方法。static不能和default同时使用。在java8中很多接口中都增加了静态方法,比如下面代码:

public class Test

{

public static void test(List list)

{

//直接使用Comparator的静态方法

list.sort(Comparator.comparing(String::length));

}

public static void main(String[] args)

{

List list = Lists.newArrayList("122","2","32");

test(list);

for (String str : list)

{

System.out.println(str);

}

}

}

java 接口的静态方法_Java8新特性:接口的默认方法与接口的静态方法相关推荐

  1. java的collect用法_java8新特性:stream流中collect用法

    java8新特性:stream流中collect用法 java8新特性:stream流中collect用法 1.toList List collectList = Stream.of(1, 2, 3, ...

  2. java lamdba表达式效率_java8新特性Lambda表达式为什么运行效率低

    Lambda表达式为什么运行效率低 准备 我为什么说Lambda表达式运行效率低. 先准备一个list: 先用Lambda表达式的方式来循环一下这个list: 运行时间大概为110ms 再用普通方式来 ...

  3. java三目表达式_Java8新特性Lambda表达式

    1 Lambda表达式 对于很多计算机语言来说,Lambda表达式并不是陌生的语法格式,而对于Java而言,它的到来比较晚,直到Java8更新之后,Lambda表达式才正式出现在Java语法中.所以如 ...

  4. java打印日期序列_Java8新特性之新日期API

    早期的日期 API 在早期也就是 Java 8 之前,JDK 原生比较有名的有两个类: Date 类 Calendar 类 这两个类相对来说用起来是比较困难的,之前我们往往是用的第三方的库. 新日期 ...

  5. java 8 详解_java8新特性详解(转载)

    1.Lambda演变过程 @Data @ToString @NoArgsConstructor @AllArgsConstructorpublic classStudent {//名字 private ...

  6. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  7. [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

    9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分.C#8.0的新特性之一就是默认接口实现.在本文中,我们将一起来聊聊默认接口实现. 众所周知,对现有应用程序的接口 ...

  8. Java基础20:Java8新特性终极指南

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. Java基础:JDK1.5新特性

    1. ENUM枚举 1.1 枚举概述 枚举是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例 ...

最新文章

  1. 皮一皮:老外这是人傻钱多啊...
  2. 160个Crackme024之Opcode加密
  3. 轻量级分布式任务调度平台 XXL-JOB
  4. java jar合并_多个jar包合并成一个jar包(ant)
  5. “拒绝访问”协助方案
  6. STM32工作笔记0025---理解并联电阻分流
  7. 模拟jQuery,简单仿写API
  8. Android 多线程之阻塞队列
  9. html 自定义标签 ios,iOS标签 | 菜鸟教程
  10. SpringBoot2.4.2+Vue集成Activiti6流程引擎
  11. java阿里云短信验证码发送
  12. 学计算机电脑硬盘容量多大好,电脑系统盘应该分多大空间最合适,赶紧学习一下...
  13. 多旋翼无人机构成及其原理详解
  14. linux安装mysql deb_Ubuntu下通过deb的bundle文件安装MySQL
  15. 一次 Young GC 的优化实践(FinalReference 相关)
  16. 让Boo成为头等语言的新尝试
  17. 【Windows 问题系列第 14 篇】如何删除 Win10 系统自带的微软拼音输入法
  18. Schnorr签名算法(初始化和签名)C语言实现
  19. 如何在Ubuntu上安装OnlyOffice Docs 7.1?
  20. matlab 验证两个电阻并联误差会变小

热门文章

  1. 在ASP.NET Core中使用brotli压缩
  2. 迁移.net framework 工程到.net core
  3. 关系型数据库的分片原则
  4. ASP.NET Core 源码学习之 Logging[2]:Configure
  5. 前端模块化工具--webpack学习心得
  6. Consul 服务注册与服务发现
  7. django23:BS4/kindeditor上传图片
  8. ArcGIS实验教程——实验三十一:ArcGIS构建泰森多边形(Thiessen Polygon)实例精解
  9. TCP协议之如何保证传输的可靠性
  10. ios之第一个程序Hello word, I am chenyu !