百科问答小站 logo
百科问答小站 font logo



Java 8接口有default method后是不是可以放弃抽象类了? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

Java 8的接口上的default method最初的设计目的是让已经存在的接口可以演化——添加新方法而不需要原本已经存在的实现该接口的类做任何改变(甚至不需要重新编译)就可以使用该新版本的接口。

以Java的

java.util.List

接口为例,它在Java SE 7的时候还没有sort()方法,而到Java SE 8的时候添加了这个方法。那么如果我以前在Java SE 7的时候写了个类 MyList 实现了 List<T> 接口,我当时是不需要实现这个 sort() 方法的;当我升级到JDK8的时候,突然发现接口上多了个方法,于是 MyList 类就也得实现这个方法并且重新编译才可以继续使用了,对不对?

所以就有了default method。上述 List.sort() 方法在Java SE 8里就是一个default method,它在接口上提供了默认实现,于是 MyList 即便不提供sort()的实现,也会自动从接口上继承到默认的实现,于是MyList不必重新编译也可以继续在Java SE 8使用。

确实,从Java SE 8的设计主题来看,default method是为了配合JDK标准库的函数式风格而设计的。通过default method,很多JDK里原有的接口都添加了新的可以接收FunctionalInterface参数的方法,使它们更便于以函数式风格使用。

Java 8的接口,即便有了default method,还暂时无法完全替代抽象类。它不能拥有状态,只能提供公有虚方法的默认实现。Java 9的接口已经可以有非公有的静态方法了。未来的Java版本的接口可能会有更强的功能,或许能更大程度地替代原本需要使用抽象类的场景。

例如说以前大家用ActionListener常常要傻乎乎地为一大堆方法提供空实现,如果 ActionListener 接口为所有方法都提供空的默认实现,就没这么蛋疼了,也不需要自己写个全部实现都是空方法的抽象类了。




  

相关话题

  世界顶级开源软件工程师,他们如何谋利? 
  用 C# 写个方法解析简单的 JSON 字符串有哪些思路? 
  零基础如何学爬虫技术? 
  以前 CSDN 很好,但是现在只有提问的,都是没人回复,没人参与了,现在的程序员遇到问题用什么交流呢? 
  如何理解「由于脚本在服务器上执行,因此浏览器在不支持脚本的情况下就可以显示服务器端的文件」? 
  如何在一个月内提高 C++ 水平? 
  国内人写代码的水平跟美国的差距在哪? 
  请问给变量赋值前有必要先清空吗? 
  python是用C实现的,Java是用C++实现的,那为什么不直接用C或C++呢? 
  一个即将步入大学对编程感兴趣的学生,3 年能将 Java 学到什么程度,应怎样合理分配这 3 年? 

前一个讨论
司马懿是奸臣吗?
下一个讨论
如何评价《神探夏洛克》(Sherlock)第四季第一集 The Six Thatchers?





© 2025-06-17 - tinynew.org. All Rights Reserved.
© 2025-06-17 - tinynew.org. 保留所有权利