写在前面

在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法。

接口中的默认方法

Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰 。

例如,我们可以定义一个接口MyFunction,其中,包含有一个默认方法getName,如下所示。

  1. public interface MyFunction<T>{
  2. T get(Long id);
  3. default String getName(){
  4. return "binghe";
  5. }
  6. }

默认方法的原则

在Java8中,默认方法具有“类优先”的原则。

若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时,遵循如下的原则。

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

例如,现在有一个接口为MyFunction,和一个类MyClass,如下所示。

  • MyFunction接口
  1. public interface MyFunction{
  2. default String getName(){
  3. return "MyFunction";
  4. }
  5. }
  • MyClass类
  1. public class MyClass{
  2. public String getName(){
  3. return "MyClass";
  4. }
  5. }

此时,创建SubClass类继承MyClass类,并实现MyFunction接口,如下所示。

  1. public class SubClass extends MyClass implements MyFunction{
  2. }

接下来,我们创建一个SubClassTest类,对SubClass类进行测试,如下所示。

  1. public class SubClassTest{
  2. @Test
  3. public void testDefaultFunction(){
  4. SubClass subClass = new SubClass();
  5. System.out.println(subClass.getName());
  6. }
  7. }

运行上述程序,会输出字符串:MyClass。

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

例如,现在有两个接口,分别为MyFunction和MyInterface,各自都有一个默认方法getName(),如下所示。

  • MyFunction接口
  1. public interface MyFunction{
  2. default String getName(){
  3. return "function";
  4. }
  5. }
  • MyInterface接口
  1. public interface MyInterface{
  2. default String getName(){
  3. return "interface";
  4. }
  5. }

实现类MyClass同时实现了MyFunction接口和MyInterface接口,由于MyFunction接口和MyInterface接口中都存在getName()默认方法,所以,MyClass必须覆盖getName()方法来解决冲突,如下所示。

  1. public class MyClass{
  2. @Override
  3. public String getName(){
  4. return MyInterface.super.getName();
  5. }
  6. }

此时,MyClass类中的getName方法返回的是:interface。

如果MyClass中的getName()方法覆盖的是MyFunction接口的getName()方法,如下所示。

  1. public class MyClass{
  2. @Override
  3. public String getName(){
  4. return MyFunction.super.getName();
  5. }
  6. }

此时,MyClass类中的getName方法返回的是:function。

接口中的静态方法

在Java8中,接口中允许添加静态方法,使用方式接口名.方法名。例如MyFunction接口中定义了静态方法send()。

  1. public interface MyFunction{
  2. default String getName(){
  3. return "binghe";
  4. }
  5. static void send(){
  6. System.out.println("Send Message...");
  7. }
  8. }

我们可以直接使用如下方式调用MyFunction接口的send静态方法。

  1. MyFunction.send();

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Java8新特性。

最后,附上Java8新特性核心知识图,祝大家在学习Java8新特性时少走弯路。

【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?的更多相关文章

  1. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  2. Java 8 接口中的默认方法与静态方法

    Java 8 接口中的默认方法与静态方法 1. 接口中的默认方法 允许接口中包含具有具体实现的方法,该方法称"默认方法",默认方法使用用 default 关键字修饰. public ...

  3. JDK8.0接口中的默认方法和静态方法

    我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...

  4. Java8新特性-接口中的静态方法与默认方法

    今天上午在读<Effective Java>时,有这样一句话:”接口中“不能有静态方法,于是联想起面试时老是被问接口相关的东西,决定总结一下,谁知道这一总结,就发现了自己知识的一大漏洞.  ...

  5. java8新特性——接口中的静态方法与默认方法

    以前我们知道,接口中的方法必须时抽象方法,而从 java8 开始接口中也可以有方法的实现了,叫做默认方法. 一 .默认方法(default修饰) 在 java8 中,因为存在函数式接口,一个接口中只能 ...

  6. Java8接口中的默认方法

    Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8 ...

  7. Java8新特性interface中的static方法和default方法

    static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...

  8. Java8新特性_接口中的默认方法

    默认方法由来猜想 1. Collection接口.Collections公共类.  同是操作集合,为啥要搞俩?没必要.在接口中搞一些默认实现,一个接口即搞定了. 2. Java8支持Lambda表达式 ...

  9. 乐字节-Java8新特性-接口默认方法

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

随机推荐

  1. 在web中使用shiro(会话管理,登出,shiro标签库的使用)

    在shiro的主配置文件中配置,登出的请求经过的过滤器就可以了,在shiro的过滤器中有一个名称为logout的过滤 器专门为我们处理登出请求: 一.shiro会话管理器 shiro中也提供了类似于w ...

  2. 201771030121-王国伟 实验一 软件工程准备—<问题提出与博客首秀>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 本次作业要求链接 https://www.cnblogs.com/nwnu- ...

  3. 201771030120-王嫄 实验一 软件工程准备 <课程学习目的思考>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...

  4. Kafka 的一些知识点整理【1】

    First: Kafka 是什么? Kafka 是一个发布订阅系统 最初是是LinkedIn 开发 最后交给Apache 开源组织 github地址:https://github.com/apache ...

  5. Android如何设置只有边框背景透明的背景呢?

    很简单,只需要新建一个 drawable 文件 <?xml version="1.0" encoding="utf-8"?> <shape x ...

  6. 【蓝桥杯C组】备赛基础篇之前缀和算法

    算法介绍: 设a为数组,a[i]中储存的是前i 个数(包括自己)的总和,相当于我们中学学过的前N项和,那么,弄成这样的好处是什么呢?假如我们要多次访问一段区间的总和,难道每次都加一次进行重复运算吗?? ...

  7. Anaconda3中的Jupyter notebook添加目录插件

    学习python和人工智能的相关课程时安装了Anaconda3,想在Jupyter notebook中归纳整理笔记,为了方便日后查找想安装目录(Table of Contents, TOC)插件,查找 ...

  8. vue学习-第三个DEMO(计算属性和监视) v-model基础用法

    <div id="demo"> 姓:<input type="text" placeholder="First Name" ...

  9. vue在钩子中引用方法不成功

    在组建创建成功后调用methods里的方法fn1,失败,提示not a function: created(){ getData(){} } solution: created(){ this.get ...

  10. interface和abstract 的区别和相同点

    在Java语言中,abstract class和interface是支持抽象类定义的两种机制. 不能创建abstract类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例 ...