zoukankan      html  css  js  c++  java
  • Java8 新特性default

    在JDK1.8的Iterator接口中

    package java.util;
    
    import java.util.function.Consumer;
    
    public interface Iterator<E> {
        boolean hasNext();
        E next();
        default void remove() {
            throw new UnsupportedOperationException("remove");
        }
        default void forEachRemaining(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            while (hasNext())
                action.accept(next());
        }
    }

    发现多了default修饰的具体的实现方法。

    ===========================================

    因为接口有语法限制,所以要直接改变/扩展接口内的方法变得非常困难。

    在尝试强化Java 8 Collections API,让其支持lambda表达式的时候,就面临了这样的挑战。为了克服这个困难,Java 8中引入了一个新的概念,叫做default方法,也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。

    Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。

    public class Main {
        public static void main(String[] args) {
           SimpleInterfaceImpl obj=new SimpleInterfaceImpl();
            obj.Fun();
            obj.Fun2();
        }
    }
    
    interface SimpleInterface {
        public void  Fun();
        default public void Fun2(){
            System.out.println("Fun2");
        }
    }
    
    class SimpleInterfaceImpl implements SimpleInterface {
        @Override
        public void Fun() {
            System.out.println("Fun");
        }
    }
    Fun
    Fun2
    View Code

    这里如果没有default,是不可以编译通过的。

    多接口,方法不同名

    public class Main {
        public static void main(String[] args) {
           SimpleInterfaceImpl obj=new SimpleInterfaceImpl();
            obj.Fun();
            obj.Fun2();
            obj.Fun3();
        }
    }
    
    interface SimpleInterface {
        public void  Fun();
        default public void Fun2(){
            System.out.println("Fun2");
        }
    }
    
    interface SimpleInterface2 {
        default public void Fun3(){
            System.out.println("Fun3");
        }
    }
    class SimpleInterfaceImpl implements SimpleInterface,SimpleInterface2 {
        @Override
        public void Fun() {
            System.out.println("Fun");
        }
    }
    Fun
    Fun2
    Fun3
    View Code

    多接口,有同名的default方法

    public class Main {
        public static void main(String[] args) {
           SimpleInterfaceImpl obj=new SimpleInterfaceImpl();
            obj.Fun();
            obj.Fun2();
        }
    }
    
    interface SimpleInterface {
        public void  Fun();
        default public void Fun2(){
            System.out.println("Fun2");
        }
    }
    
    interface SimpleInterface2 {
        default public void Fun2(){
            System.out.println("Fun3");
        }
    }
    class SimpleInterfaceImpl implements SimpleInterface,SimpleInterface2 {
        @Override
        public void Fun() {
            System.out.println("Fun");
        }
    }

    产生了二义性,编译不通过。

    http://www.importnew.com/7302.html

  • 相关阅读:
    MySQL 数据库常用命令
    mysql日常小总结(其实就今天)
    idea修改格式化代码快捷键
    let和const的区别
    【山外笔记-Powershell 教程】学习资源汇总
    C语言实现高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。
    学生的记录由学号和成绩组成,输入的指定分数60 69范围,求分数范围内的学生成绩输出
    判断一个字符串是否是回文
    删去一维无序数组中所有相同的数,使之只剩一个。
    删去一维有序数组中所有相同的数,使之只剩一个。
  • 原文地址:https://www.cnblogs.com/hongdada/p/6050851.html
Copyright © 2011-2022 走看看