zoukankan      html  css  js  c++  java
  • [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 参考文献

  • 相关阅读:
    区块链|肖臻《区块链技术与应用》公开课之以太坊篇
    区块链|肖臻《区块链技术与应用》公开课之比特币篇
    复合数据类型
    广播变量和累加器
    mysql_基本操作
    8.10 NOI模拟赛 fzhtql SAM 后缀数组 启发式合并 dsu on tree 树状数组 set 线段树合并
    心态
    7.29 NOI 模拟赛 Stars 状压 dp
    8.2 NOI模拟赛 Palindrome dp 组合计数 分类讨论
    7.30 NOI模拟赛 B Easy Sum 分块 NTT
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/13801052.html
Copyright © 2011-2022 走看看