java8-默认方法

默认方法

  • 默认方法背景:接口本应该是一种约定,不提供实现。但是如果一旦想在接口上增加新的方法,所有的实现类都需要调整。引入默认方法就是为了避免这种情况,向前兼容
  • 把默认方法作为库、框架向前兼容的手段(java8中新增了lambda表达式,使用default方法来进行向前兼容)
  • 继承有三种情况
    • 继承后重写方法
    • 继承后不重写方法
    • 继承后将默认方法重新声明为抽象方法
      参考:

为什么有默认方法、继承有三种:https://blog.csdn.net/u010003835/article/details/76850242
概述:http://www.runoob.com/java/java8-default-methods.html

多继承的冲突(菱形问题)

  • 两个default方法如果不存在关系(重写和被重写的关系),则要手动自己解决。
/*
*   Inter1->Inter4
*   Inter2
*   Inter1+Inter2->UseInter1Inter4
* */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface Inter4 extends Inter1 {
    @Override
    default void print() {
        System.out.println("interface Inter4");
    }
}
interface Inter2 {
    default void print(){
        System.out.println("interface Inter2");
    }
}
class UseInter4Inter2 implements Inter4,Inter2{
    @Override
    public void print() {
        Inter4.super.print();// 注意这个地方需要加super
    }
}
  • 继承的两个接口之间存在关系,调用原则:“调用更加详细的方法”
/*
* Inter1-》Inter4(重写default方法)
* Inter1+Inter4-》UseInter4Inter1
* 调用的Inter4中的函数,Inter1和Inter4中的方法存在重写和被重写的关系,这种情况下自动用Inter4中的print()(“更加详细的方法”)
* */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface Inter4 extends Inter1 {
    @Override
    default void print() {
        System.out.println("interface Inter4");
    }
}
class UseInter4Inter1 implements Inter4,Inter1{
}
  • 菱形问题,继承的两个接口都继承了同一个接口,然后都重写了默认方法。这时两个接口中的默认方法是没有关系的,需要手动解决
/*菱形问题
* Inter1->UseInter11(重写default方法)
* Inter1->UseInter12(重写default方法)
* UseInter11+UseInter12->UseUseInter11UseInter12 (需要手动解决冲突)
* */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface UseInter11 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter11");
    }
}
interface UseInter12 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter12");
    }
}
class UseUseInter11UseInter12 implements UseInter11,UseInter12{

    @Override
    public void print() {
        System.out.println("class UseUseInter11UseInter12");
    }
}
  • 菱形问题的第二种,继承的两个接口都继承了同一个接口,然后其中一个重写了默认方法。此时认为两个默认方法存在关系,用重写后"更详细"的那个
/*菱形问题
 * Inter1->UseInter13(重写default方法)
 * Inter1->UseInter14
 * UseInter13+UseInter14->UseUseInter13UseInter14  (调用UseInter13中的default方法)
 * */
interface Inter1 {
    default void print(){
        System.out.println("interface Inter1");
    }
}
interface UseInter13 extends Inter1{
    @Override
    default void print() {
        System.out.println("interface UseInter13");
    }
}
interface UseInter14 extends Inter1{
}
class UseUseInter13UseInter14 implements UseInter13,UseInter14{
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值