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揭秘(三)Default 方法

第二章  Default 方法 为什么要有Default方法 一旦Java8发布,有件事情就显得非常重要,即能在不破坏现有实现架构的情况下往接口里增加方法。之所以引入Default方法到Java8...
  • wwwsssaaaddd
  • wwwsssaaaddd
  • 2014年04月21日 01:46
  • 26488

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

JAVA8中接口interface引入方法实现的猜想在JAVA8之前java中的接口类型旨在定义类型的接口规约,并不能拥有自己的方法实现,具体实现完全交由实现类自己完成。以普通人和中上阶层为例,为各自...
  • zixiao217
  • zixiao217
  • 2017年04月16日 19:58
  • 1365

Java 8的default方法详解

Java 8的default方法详解作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszsJava 8新增了default方法,它可以在接口添加新功能特性,而且还...
  • chszs
  • chszs
  • 2015年01月11日 16:26
  • 5581

Java中default的两种用法

一。用于switch模块中 在switch语句中,如果没有任何 case 表达式与开关值匹配,则控制传递给跟在可选 default 标签后的语句。如果没有 default 标签,则控制传递到 swi...
  • XueminXu
  • XueminXu
  • 2013年07月23日 11:33
  • 6809

Vue中,methods中调用filters里的过滤器

需求:vue中,除了在模板中使用过滤器,有时候,methods中也需要使用filters中的过滤器,filters: { formatScore(score) { ...
  • huipo22
  • huipo22
  • 2017年10月16日 18:13
  • 535

Java学习笔记(1):访问修饰符protected和default的区别

访问修饰符,即对访问范围的控制。在Java中,有以下几种访问修饰符: 1.对类而言: (1)public:在所有的包中均可见 (2)default(默认):只在该类所在包中可见 注:类不能用priva...
  • jinmo277
  • jinmo277
  • 2015年08月28日 19:49
  • 1628

Java8中接口中可添加的default修饰方法体

我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子: 1 2 ...
  • u012506661
  • u012506661
  • 2016年10月17日 14:28
  • 2132

【09类和模块】——3:javascript中java式的类继承

上一篇博文【09类和模块】——2类和构造函数 这里我们来说一下javascript中java式的类继承,如果你有过java或其他类似的强类型的面向对象编程语言开发的经历的话,你会发现javascr...
  • NextStand
  • NextStand
  • 2016年03月27日 18:51
  • 650

Java中的Default方法

Java中的Default方法Java8在接口中新引入了一种default方法。目的是保留原先的结构,只将改动加入到接口中。public interface A { default void c...
  • saintmetatron
  • saintmetatron
  • 2015年12月03日 18:04
  • 1038

Java8 default methods 默认方法的概念与代码解析

一、基本概念   Default methods enable you to add new functionality to the interfaces of your libraries ...
  • a1259109679
  • a1259109679
  • 2015年05月08日 15:18
  • 229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 8 Default Methods
举报原因:
原因补充:

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