[Java SE]Java8新特性——默认方法

1 简述

默认方法就是接口可以有实现方法,而且可以不需要实现类去实现其方法

默认方法(default void hello()) := 一个在接口里面有了一个(默认)实现的方法

1. 子类优先继承父类的方法。
         如果父类没有相同签名的方法:
             #1 子类才继承接口的默认方法;
             #2 若子类实现了2个及以上的相同签名默认方法的接口时:
                 在子类中必须/强制 Override(重写) 默认方法; 否则,报编译错误
                 (因为:此时编译器无法判别,该调用哪个接口的默认方法)
         如果父类中存在相同签名的方法:
             #1 子类继承父类相同签名的方法;
             #2 不论何种情况:
                 子类中不必再强制 Override(重写) 默认方法
  • 为什么要有这个特性?
首先,之前的接口是个双刃剑。
    好处是,面向抽象而不是面向具体编程;
    缺陷是,当需要修改接口时候,需要修改全部实现该接口的类。

[针对其缺陷]
目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是: 在JDK里给相关的接口添加新的方法及实现。
然而,对于已经发布的版本,没法在给接口添加新方法的同时,不影响已有的实现。
所以,引进的默认方法。其目的是: 为了解决接口的修改与现有的实现不兼容的问题。

易错的使用场景:继承 或 实现具有相同默认方法的父类或接口问题

2 代码示例

interface A

public interface A {
    String hi();
    String greet();
    default void hello() {
        System.out.println("A.hello");
    }
}

interface B

public interface B {
    String hi();
    String hh();
    default void hello() {
        System.out.println("B.hello");
    }
}

class D

public class D {
    public void hello() {//与接口 A / B 存在相同签名的方法
        System.out.println("D.hello");
    }
}

class C

  • 情况1: public class C extends D implements A, B
public class C extends D implements A, B{
    @Override
    public String hi() {
        return "C.hi";
    }
   @Override
    public String greet() {
        return "C.greet";
    }
    @Override
    public String hh() {
        return "C.hh";
    }
    /*
       默认方法(default void hello()) := 一个在接口里面有了一个实现的方法
       1. 子类优先继承父类的方法。
                如果父类没有相同签名的方法:
                    #1 子类才继承接口的默认方法;
                    #2 若子类实现了2个及以上的相同签名默认方法的接口时:
                        在子类中必须/强制 Override(重写) 默认方法; 否则,报编译错误
                如果父类中存在相同签名的方法:
                    #1 子类继承父类相同签名的方法;
                    #2 不论何种情况:
                        子类中不必再强制 Override(重写) 默认方法
     */
    /**
     * 重写 默认方法
     * 若子类不处理默认方法hello时,类C将编译出错,解决方式: 要么重新覆盖,要么指定实现父接口的该方法
     * 编译报错解决1:完全覆盖法
     */
/*    @Override
    public void hello() {
        System.out.println("C.hello");
    }*/
    /**
     * 重写 默认方法
     * 编译报错解决2:指定实现的父接口
     */
/*    @Override
    public void hello() {
        A.super.hello();
        B.super.hello();
    }*/
}
  • 情况2: public class C implements A, B
  • 情况3: public class C implements A

X 参考文献

原文地址:https://www.cnblogs.com/johnnyzen/p/13801052.html