首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8 基础教程 - 默认方法

Java 8 基础教程 - 默认方法

作者头像
代码拾遗
发布2018-07-24 15:50:46
4800
发布2018-07-24 15:50:46
举报
文章被收录于专栏:代码拾遗代码拾遗
什么是默认方法

正如其名,在Java 8中,默认方法就是使用default关键字标记的定义在接口中的方法。如果子类不重写这些方法,那么在子类调用这些方法的时候会直接调用接口中的默认方法。其形式如下:

public interfce Moveable{
    default void move(){
        System.out.println("move");
    }
}

子类继承接口,无需重写这个方法即可调用

public class Animal implements Moveable{
    public static void main(String[] args){
        Animal tiger = new Animal();
        tiger.move();
    }
}

输出:

Move

如果子类想要重写这个默认方法,只需要和普通的重写接口一样

public class Animal implements Moveable{

    public void move(){
        System.out.println("I am running");
    }

    public static void main(String[] args){
        Animal tiger = new Animal();
        tiger.move();
    }
}

使用默认方法的好处:

  • 定义静态默认方法:在接口中定义静态默认方法,使得其所有继承接口的子类都可以调用这些静态方法,这样可以在接口中集中静态方法,其子类都可以分享,而无需将静态方法分开定义。
  • 提供兼容性,如果已经发布的接口想要添加新的方法,只需要添加默认方法即可,子类无需做出任何改变。
为什么在Java 8 要引入默认方法

最简单的回单就是,为了支持Lambda表达式。因为Java 8中引入了Lambda表达式,所以很多Java的核心类都需要修改以便使用新的Lambda表达式,但是一些类例如,java.util.List,不仅仅是不JDK的类实现,同样被很多第三方的库继承,如果修改了java.util.List 接口,那么其他所有的第三方库都必须重新实现这些方法,最终导致无法兼容。所以就引入了默认方法。例如:java.lang.Iterable,添加的新方法。

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

使用

import java.util.ArrayList;
import java.util.List;

public class Animal implements Moveable{
    public static void main(String[] args){
        List<Animal> list = new ArrayList();
        list.add(new Animal());
        list.add(new Animal());
        list.add(new Animal());

        //Iterator code reduced to one line
        list.forEach((Moveable p) -> p.move());
    }
}

添加的默认方法,其所有的子类都默认继承,而无需重写。

默认方法继承发生冲突如何解决

在Java中接口是可以多继承的,当一个类继承多个接口,但是默认方法相同是处理的原则是:

  • 如果子类覆盖,直接调用子类方法
  • 如果函数有相同的签名,选择更加明确的默认方法,例如,Moveable和Walkable,Walkable继承与Moveable,那么就选择Walkable中的默认方法。
  • 如果两个接口平级,没有继承关系,编译器报错。这个时候可以通过制定执行某个方法来确定
Walkable.super.move();
//or
Moveable.super.move();
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码拾遗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是默认方法
  • 为什么在Java 8 要引入默认方法
  • 默认方法继承发生冲突如何解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档