Java8 接口的Default方法多继承的几种情况总结

在Java中接口是多继承的,如果某一个类需要实现它需要实现它的所有方法,然而在Java8中,出现一个default 类型方法

,那么default方法名相同的可以如果被多继承是以哪个为准

准备工作:

A类

public interface A {
    default void print(){
        System.out.println("This is A Method");
    }
}

B类

public interface B {
    default void print() {
        System.out.println("B Method");
    }
}

C类 C继承自A

public interface C extends A {
    @Override
    default void print() {
        System.out.println("C Method");
    }
}

这样会出现两种情况

  1. 实现类 实现了A,也实现了A的子接口C
  2. 实现类 实现了A,也实现了B(它们都有相同方法名的default 方法)

class实现类1:

public static class MyDefaultMethod1 implements A,C{

    }

开始运行:

 public static void main(String[] args) {
        MyDefaultMethod1 m1 = new MyDefaultMethod1();
        m1.print();

    }

运行结果:

C Method

结果表明:实现类运行的default方法是以C类覆盖A类的print方法的结果为准。

class实现类2:

  public static class MyDefaultMethod2 implements A,B{

    
    }

 报错!

Error:(8, 19) java: 类MyDefaultMethod2从类型 A 和 B 中继承了print() 的不相关默认值

这里也出现C++中经常多继承出现的问题,找到的结果是多个,需要唯一指定该方法,所以,我们必须重写print方法

public static class MyDefaultMethod2 implements A,B{

        @Override
        public void print() {
            //而且还可以分别调用
            A.super.print();
            B.super.print();
        }
    }

开始运行:

 public static void main(String[] args) {
        MyDefaultMethod2 m2 = new MyDefaultMethod2();
        m2.print();

    }

运行结果:

This is A Method
B Method

此外,这么写是错误❌的,因为已经被 A 已经被 它的子接口BExtendA 覆盖。

Error:(7, 14) java: 默认超级调用中的类型限定符com.xxx.A错误
  冗余接口 com.xxx.A 已由 com.xxx.C 扩展

  public static class MyDefaultMethod1 implements A,C{
        @Override
        public void print(){
            A.super.print();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值