实现两个(多个)接口或者继承类时对同名方法的处理分析

今天看到有人在文章中说:
在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现 两个接口,接口中定义了一样的默认方法,必须重写,不然会报错

于是我自己验证了下:
在这里插入图片描述

package interfacetest;

/**
 * @author liuxx
 * @date 2021/1/19 14:47
 */
public interface Interface01 {
    void method();

    default void method2(){
        System.out.println("Interface01 default");
    }
    static void method3(){
        System.out.println("Interface01 static");
    }
}

package interfacetest;

/**
 * @author liuxx
 * @date 2021/1/19 14:47
 */
public interface Interface02 {
    void method();

    default void method2(){
        System.out.println("Interface02 default");
    }

    static void method3(){
        System.out.println("Interface02 static");
    }
}

package interfacetest;

/**
 * @author liuxx
 * @date 2021/1/19 15:09
 */
public class FatherClass {

    static void method4(){
        System.out.println("FatherClass static method4");
    }

    public void method6(){
        System.out.println("FatherClass public method6");
    }
}

package interfacetest;

/**
 * @author liuxx
 * @date 2021/1/19 14:48
 */
public class InterfaceImpl extends FatherClass implements Interface01, Interface02 {
    @Override
    public void method() {

    }

}


验证结果:好家伙直接编译报错
在这里插入图片描述
在这里插入图片描述
报错处理:实现method2()
在这里插入图片描述
继续编译:依旧报错
在这里插入图片描述
报错原因分析:因为接口中定义的default方沟必须被实现类实现,但是由于method4 在FatherClass是static修饰,所以不会被实现类重写,于是存在冲突,(具体怎么解释我也不太清楚 -! 就放这里看哪个大佬能指点一下)

继续处理:fatherclass中删除method4
在这里插入图片描述

好了现在不报错了,但是发现有这样的一个标记,这是啥呢,看下idea的提示
在这里插入图片描述
在这里插入图片描述
英文翻译大家看一下,我就不翻译了,反正就是说这里的method6是对Interface01中的method6的实现。因为fatherclass的子类InterfaceImpl实现了这个接口。(具体为啥我也不明白)。这里好像对上面的那个遗留问题也做了一部分解释,(猜想1:子类无法对接口中的default方法重写时加上static,因为这个method6没有static没有报错,而method4有所以报错了)

验证猜想1:直接在子类中用static修饰实现method4
在这里插入图片描述
在这里插入图片描述
猜想1验证结果总结:反正我觉得我说的没毛病,有的话你们直接说。我改!

好了,最后进行数据输出,看看这几个方法到底是啥样的结果

在这里插入图片描述
很不幸,这里报错了:至于为啥我仔细想了下,两个接口中的method3和method4。猜想是method3在两个接口中均为static,实现类不知道调用哪个,不验证了,反正我猜的。所以只能类名调用。

package interfacetest;

/**
 * @author liuxx
 * @date 2021/1/19 17:02
 */
public class Main {
    public static void main(String[] args) {
        InterfaceImpl impl = new InterfaceImpl();
        impl.method();
        impl.method2();
        Interface01.method3();
        Interface02.method3();
        impl.method4();
        impl.method5();
        impl.method6();
    }
}

输出结果如下

InterfaceImpl  method 
InterfaceImpl  method2
Interface01 static method3 
Interface02 static method3
Interface01 default method4
Interface01 default method5
FatherClass public method6

结果论证了啥

输出值说明
InterfaceImpl method直接实现接口声明的普通方法,因为接口没有实现,所以只能是实现类的方法
InterfaceImpl method2直接实现接口声明的default方法,所以是实现类的方法
Interface01 static method3没有意义直接类名调用的
Interface02 static method3没有意义直接类名调用的
Interface01 default method4不实现的方法直接调用,调用的是default方法而不是static修饰的
Interface01 default method5好像没有证明啥,难道是我傻了?
FatherClass public method6接口default修饰的方法和父类中同名的方法,调用的是父类的
FatherClass static method7,如果父类和接口都定义了静态方法,如果通过是实现类调用的话调用的是父类的方法(证明在最后)

然后我又猜想method4是不是因为实现的顺序不一样才导致调用的是Interface01的方法.于是再来一遍
在这里插入图片描述
换下位置,然后输出还是一样的

InterfaceImpl  method
InterfaceImpl  method2
Interface01 static method3
Interface02 static method3
Interface01 default method4
Interface01 default method5
FatherClass public method6

然后我又想确定下如果都是static的方法,在父类和接口中都有,那么会如何调用呢
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行结果说明了啥?
:::如果父类和接口都定义了静态方法,如果通过是实现类调用的话调用的是父类的方法

中间还有一些逻辑缺陷,但是我想不到了,我记得看过一句话如果你觉得你写的代码有问题,那其中肯定是存在问题的欢迎大家指正!感激!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值