Java 8 Default Methods

翻译 2017年01月04日 00:04:45

如果翻看jdk源码的interface,会发现多了default关键词。
简单介绍下。
原文

default使我们能够在不中断实现该接口的类的情况下向接口添加新的功能。 让我们来看看下面的例子。

public class MyClass implements InterfaceA {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void saySomething() {
        System.out.println("Hello World");
    }

}

interface InterfaceA {
  public void saySomething(); 

}

上面的代码显示了类MyClass实现InterfaceA的方法saySomething()。 现在我们给InterfaceA添加一个名为sayHi()的新方法。 通过这样做,我们向类MyClass引入一个问题,因为它不会编译,直到我们提供方法sayHi()的实现。
这时Default就有用了。 通过在方法的访问修饰符之前添加关键字default,我们不必为类MyClass中的方法sayHi()提供实现。
在最严格的意义上,default是倒退一步,因为它们允许你用代码“污染”你的接口。 但它们提供了最优雅和实用的方式来允许向后兼容性。 它使jdk更容易更新所有Collections类,并为您改装现有的Lambda代码。(其实这就是default产生最初原因)

public class MyClass implements InterfaceA {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void saySomething() {
        System.out.println("Hello World");
    }

}

interface InterfaceA {

    public void saySomething();

    default public void sayHi() {
      System.out.println("Hi");
    }

}

注意,我们必须提供所有default方法的实现。 因此,default方法为我们提供了在接口中实现方法的灵活性。 如果具体类不提供该方法的实现,那么实现将被用作默认值。

多接口冲突

由于java中的类可以实现多个接口,可能会有一个情况,其中两个或更多的接口有一个default方法具有相同的名称,因此导致冲突,因为java不知道一次使用什么方法。 这将导致编译错误:类MyClass从类型InterfaceA和InterfaceB继承default sayHi()
让我们来看看下面的例子。

public class MyClass implements InterfaceA, InterfaceB {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void saySomething() {
        System.out.println("Hello World");
    }

}

interface InterfaceA {

    public void saySomething();

    default public void sayHi() {
        System.out.println("Hi from InterfaceA");
    }

}

interface InterfaceB {
     default public void sayHi() {
        System.out.println("Hi from InterfaceB");
    }
}

为了解决这样的情况,我们必须在类MyClass中提供sayHi()方法的实现,因此覆盖InterfaceA和InterfaceB中的两个方法。

public class MyClass implements InterfaceA, InterfaceB {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void saySomething() {
        System.out.println("Hello World");
    }

    @Override
    public void sayHi() {
        System.out.println("implemetation of sayHi() in MyClass");
    }

}

interface InterfaceA {

    public void saySomething();

    default public void sayHi() {
        System.out.println("Hi from InterfaceA");
    }

}

interface InterfaceB {
     default public void sayHi() {
        System.out.println("Hi from InterfaceB");
    }
}

如果我们想要在InterfaceA或InterfaceB中专门调用一个sayHi()方法,我们也可以这样做:

public class MyClass implements InterfaceA, InterfaceB {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void saySomething() {
        System.out.println("Hello World");
    }

    @Override
    public void sayHi() {
       InterfaceA.super.sayHi();
    }

}

interface InterfaceA {

    public void saySomething();

    default public void sayHi() {
        System.out.println("Hi from InterfaceA");
    }

}

interface InterfaceB {
     default public void sayHi() {
        System.out.println("Hi from InterfaceB");
    }

相关文章推荐

精通Java8新特性Lambdas、Streams、Interface default methods

Java SE 8 是有史以来对 Java 语言和库改变最大的一次,其新特性增加了函数式编程风格的Lambda表达式。虽然一开始 lambda 表达式似乎只是“另一个语言特性”而已,但实际上,它们会改...

Interface in Java 8(Default/Static methods)

在 jdk1.7之前,在 Interface中只能 declare method, 是不可以 define method的。所以在 jdk 1.8 里面有什么不一样呢。 Default method ...
  • stanxl
  • stanxl
  • 2016年12月08日 00:11
  • 1192

Thinking at Java 8 Interface Default Methods

Java 8 离发布越来越近了,包含了许多有用的新特性,使得代码编写变得更简单些,主要的例如 Lambda 表达式,但今天的另一个主题是探讨一下接口的默认方法的新特性。   在 Java 8 中,新...
  • Keijack
  • Keijack
  • 2014年02月27日 18:18
  • 421

Java 8 Interface Changes – static methods, default methods, functional Interfaces

One of the biggest design change in Java 8 is with the concept of interfaces. Prior to Java 7, we co...

Java 8 Stream API features --- map/reduce methods

在 jdk 1.8 里面新增加了 Stream API ,为了去更高效的处理 huge data。那么怎么使用这些 API 呢,一点一点了解,先走马观花看一遍: 要做的事情是先把每个 element...
  • stanxl
  • stanxl
  • 2016年12月14日 15:35
  • 205

The Default Methods And Static Methods In Java Interface

Default Methods Default methods enable you to add new functionality to the interfaces of your lib...

【Effective Java】Ch3_Methods:Item8_重写equals方法时遵循通用约定

虽然Object类是一个具体类,但它主要还是用于扩展。因为其所有nonfinal方法(equals、hashCode、toString、clone以及finalize)都是为重写设计的,所以这些方法都...

Java8中的 Default 方法

第二章  Default 方法 为什么要有Default方法 在Java8发布之际,有件事情就显得非常重要,即在不破坏java现有实现架构的情况下能往接口里增加新方法。引入Default方法到Ja...

如何获得方法的default修饰符?JVM规范并没有java8的defalut修饰符

java8的很多特性是java虚拟机层面实现的,比如lamda表达式,而不是编译器是实现。但是java8新增的default修饰符,其实就是在接口定义的非抽象的public的修饰符。我们看下API: ...
  • kkgbn
  • kkgbn
  • 2017年05月06日 17:04
  • 307

JAVA8接口中的default、static方法使用注意事项

JAVA8中接口interface引入方法实现的猜想在JAVA8之前java中的接口类型旨在定义类型的接口规约,并不能拥有自己的方法实现,具体实现完全交由实现类自己完成。以普通人和中上阶层为例,为各自...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 8 Default Methods
举报原因:
原因补充:

(最多只允许输入30个字)