Java8接口的默认方法

Java8接口的默认方法

什么是默认方法,为什么要有默认方法?

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。

为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了使接口没有引入与现有的实现不兼容发展。

如以下所示,

public interface Animal {
  default void eat() {
    System.out.println("animal eat default method");
  }
}

声明了一个接口,里面只有一个默认方法。然后写一个具体的类实现这个接口,

public class Dog implements Animal {
  public void sayHi() {
    System.out.println("dog");
  }

  public static void main(String args[]) {
    Dog dog = new Dog();
    dog.eat();
  }
}

再具体的类里面不是必须重写默认方法,但必须要实现抽象方法。

默认方法的多重继承
如下所示代码,

public interface A {

  void doSomething();

  default void hello() {
    System.out.println("hello world from interface A");
  }

  default void foo() {
    System.out.println("foo from interface A");
  }
}

interface B extends A {
  default void hello() {
    System.out.println("hello world from interface B");
    A.super.hello();
    this.foo();
    A.super.foo();
  }
}

class C implements B, A {

  @Override
  public void doSomething() {
    System.out.println("c object need do something");
  }

  public static void main(String args[]) {
    A obj = new C();
    obj.hello();//调用B的方法
    obj.doSomething();
  }
}

打印结果:

hello world from interface B

hello world from interface A

foo from interface A

foo from interface A

c object need do something

obj.hello()调用的是B接口中的默认方法。同时在B接口中的默认方法有调用了父接口中的默认方法。

我们再来看一个例子,思考一下在多重继承中,如果出现了同名的默认方法,如下所示,

public interface D {
  default void hello() {
    System.out.println("hello world from D");
  }
}

interface E {
  default void hello() {
    System.out.println("hello world from E");
  }
}

class F implements D, E {

  @Override
  public void hello() {
    System.out.println("hello world F class");
    D.super.hello();
    E.super.hello();
  }

  public static void main(String args[]) {
    F f = new F();
    f.hello();
  }

}

我们需要制定调用哪个接口的默认方法如下,

 D.super.hello();
 E.super.hello();

另一个java8的接口默认方法实例

java8新增了接口的默认方法, 也就是说在接口中也可以有实现了, 这个实现方法是默认的实现,你也可以在接口的实现类里对此默认方法进行重写。

如下实例:

public class AppInterfaceDefaultMethod {

  public static interface DefaultMethodDemo {
    //定义默认方法, 默认方法前面加default关键字, 后面跟方法声明和方法体
    default void demo(String input) {
      System.out.println(input);
    }

    void doSomething();
  }

  public static class DemoClass implements DefaultMethodDemo {
    @Override
    public void doSomething() {
      System.out.println("do something");
    }
  }

  public static class DemoClassOverrideDemo implements DefaultMethodDemo {
    //重写了默认方法
    @Override
    public void demo(String input) {
      System.out.println("demo " + input + " by override method");
    }

    @Override
    public void doSomething() {

      System.out.println("do something");
    }
  }

  public static void main(String[] args) {
    DefaultMethodDemo demo = new DemoClass();
    demo.demo("abc");

    DefaultMethodDemo demoOverride = new DemoClassOverrideDemo();
    demoOverride.demo("abc");
  }
}

以上就是关于Java8接口的默认方法详细介绍,希望对大家的学习有所帮助。

(0)

相关推荐

  • Default Methods实例解析

    Oracle官网是这样介绍默认方法的,使用默认方法,可以达到往接口里面增加新的功能,而且保持与老版本代码兼容,也就是原来的实现类可以不需要被动修改.所以,默认方法位置是在接口里面:默认方法具有实现,不会强制具体类来现.Java 8要充分利用Lambda,需要增强大量的类库,但是又希望做到兼容性,只能用默认方法这个大招. 默认方法 默认方法与普通的接口方法相比,最前面增加default关键字,参数列表之后接大括号,实现该方法,再后面没有分号. 如果翻看jdk源码的interface,会发现多了de

  • 谨慎使用Java8的默认方法

    默认方法给JVM的指令集增加了一个非常不错的新特性.使用了默认方法之后,如果库中的接口增加了新的方法,实现了这个接口的用户类能够自动获得这个方法的默认实现.一旦用户想更新他的实现类的话,只需覆盖一下这个默认方法就可以了,取而代之的是一个在特定场景下更有意义的实现.更棒的是,用户可以在重写的方法里面调用接口的默认实现来增加一些额外的功能. 目前为止一切都还不错.然而,给现有的Java接口增加默认方法可能会导致代码的不兼容.看个例子就很容易能明白了.假设有一个库,它需要用户实现它的一个接口作为输入:

  • Java8新特性之默认方法(default)浅析

    一.什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现.所以引进的默认方法

  • Java Collections.sort()实现List排序的默认方法和自定义方法

    1.java提供的默认list排序方法 主要代码: List<String> list = new ArrayList();list.add("刘媛媛"); list.add("王硕"); list.add("李明"); list.add("刘迪"); list.add("刘布"); //升序 Collections.sort(list,Collator.getInstance(java.uti

  • Java8接口的默认方法

    Java8接口的默认方法 什么是默认方法,为什么要有默认方法? 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有

  • Java8接口之默认方法与静态方法详解

    目录 前言 为什么选择默认方法? Java 8示例:接口中的默认方法 Java 8示例:接口中的静态方法 Java 8 - 抽象类与接口 总结 前言 在Java8之前,java中的接口只能有抽象方法.默认情况下,接口的所有方法都是公共和抽象的.Java8允许接口具有默认和静态方法.我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类. 为什么选择默认方法? 例如,如果A.B.C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInter

  • 一篇文章带你认识Java8接口的默认方法

    前言 Java8是Oracle于2014年3月发布的一个重要版本,其API在现存的接口上引入了非常多的新方法. 例如,Java8的List接口新增了sort方法.在Java8之前,则每个实现了List接口的类必须定义sort方法的实现,或者从父类中继承它的实现.想象一下,如果List接口的继承体系非常庞杂,那么整个集合框架的维护量有多么大! 为此,在Java8中引入了一种新的机制:接口支持申明带实现的方法. 默认方法 前文提到了Java8中List接口新增了sort方法,其源码如下: publi

  • Java8中新特性Optional、接口中默认方法和静态方法详解

    前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.下面本文就给大家详细介绍了Java8中新特性Optional.接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧. Optional Optional 类(java.util.Optional) 是一个

  • Java8中的默认方法(面试者必看)

    背景 在Java8之前,定义在接口中的所有方法都需要在接口实现类中提供一个实现,如果接口的提供者需要升级接口,添加新的方法,那么所有的实现类都需要把这个新增的方法实现一遍,如果说所有的实现类能够自己控制的话,那么还能接受,但是现实情况是实现类可能不受自己控制.比如说Java中的集合框架中的List接口添加一个方法,那么Apache Commons这种框架就会很难受,必须修改所有实现了List的实现类 现在的接口有哪些不便 向已经发布的接口中添加新的方法是问题的根源,一旦接口发生变化,接口的实现者

  • java接口使用默认方法的讲解

    1.接口中默认方法的格式: public default返回值类型方法名(参数列表) { } 2.接口中默认方法的注意事项: 默认的方法不是抽象的方法,所以不重写.但是可以重写,重写的时候可以删除关键词. public可以省略,default不能省略. 3.实例 1:定义一个接口MyInterface,里面有两个抽象方法: void show1(); void show2(); 2:定义接口的两个实现类: MyInterface ImplOne MyInterface ImplTwo 3:定义测

  • 30分钟入门Java8之默认方法和静态接口方法学习

    前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方法和静态接口方法. 这一Java8的新语言特性,在Android N中也得到了支持.至于如何在Android开发中配置Java8的开发环境,请查看上一篇文章30分钟入门Java8之lambda表达式. 默认方法 默认方法让我们能给我们的软件库的接口增加新的方法,并且能保证对使用这个接口的老版本代码的兼容性. 下面通过一个简单的例子来深入理解下默认

  • Java8新特性之接口中的默认方法和静态方法

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法. 接口中的默认方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰 . 例如,我们可以定义一个接口MyFunction,其中,包含有一个默认方法getName,如下所示. public interface MyF

  • 深入理解Java8新特性之接口中的默认方法和静态方法

    1.接口中的默认方法和静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为 "默认方法" ,默认方法使用 default 关键字修饰. 接口默认方法的 " 类优先 " 原则.若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时 选择父类中的方法.如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略. 接口冲突.如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方

随机推荐