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

  • 相关阅读:
    Windows系统开机硬盘自检问题解决
    更改软件默认安装路径
    windows添加开机启动项
    xp 如何打开(进行)远程桌面连接
    xp看系统位数
    教你创建一个别人打不开删不掉的文件夹(干坏事爱好者必看)
    无操作一段时间显示器无信号
    长时间用电脑,(给窗口选一个合适的颜色)设置窗口绿色
    Windows右键菜单设置与应用技巧
    Outlook如何定时发邮件
  • 原文地址:https://www.cnblogs.com/hongdada/p/6050851.html
Copyright © 2011-2022 走看看