[Java SE] 深度解析:默认方法[JDK8-]
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
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号