java8中的default 意义

1.default关键字的作用

可以在接口内部提供一些默认的实现方法,子类实现时不需要提供实现方法,自己重写也可以。例如java8的Iterable接口的forEach。

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

2.为什么要这么做?

想象一下,你java7的代码写了一个MyIterable实现了Iterable接口(此时还没forEach方法),但是当你将MyIterable移植到java8后,如果forEach不是default的,是不是你的代码会报错

    public static class MyIterable implements Iterable {

        //可自己实现也可以直接用父接口的
        @Override
        public void forEach(Consumer action) {
            System.err.println("调用我们自己的 forEach");
        }
        @Override
        public Iterator iterator() {
            // TODO Auto-generated method stub
            return null;
        }
    }

3.如果你实现了两个接口怎么办?

    public static interface A {
        public default void say() {
        }
    }
    public static interface B {
        public default void say() {
        }
    }
    public static class Foo implements A,B {
        @Override
        public void say() {
            // TODO Auto-generated method stub
            B.super.say();
        }
    }

这个时候如果子类不提供实现方法的话编译器会报错,因为它也不知道要调哪个接口的say方法。

4.结论

当我们修改代码添加新功能时必须要想尽办法保证要兼容之前的代码,何况这还是伟大的java。

《 祸莫大于不知足;咎莫大于欲得。故知足之足,常足矣 》
释义:罪恶没有比欲望更大罪恶。灾祸没有比不知足更大的灾祸;灾祸最大的原因就是想得到(欲望)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容