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

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

于是我自己验证了下:
实现两个(多个)接口或者继承类时对同名方法的处理分析_第1张图片

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()
实现两个(多个)接口或者继承类时对同名方法的处理分析_第2张图片
继续编译:依旧报错
在这里插入图片描述
报错原因分析:因为接口中定义的default方沟必须被实现类实现,但是由于method4 在FatherClass是static修饰,所以不会被实现类重写,于是存在冲突,(具体怎么解释我也不太清楚 -! 就放这里看哪个大佬能指点一下)

继续处理:fatherclass中删除method4
实现两个(多个)接口或者继承类时对同名方法的处理分析_第3张图片

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

验证猜想1:直接在子类中用static修饰实现method4
实现两个(多个)接口或者继承类时对同名方法的处理分析_第6张图片
在这里插入图片描述
猜想1验证结果总结:反正我觉得我说的没毛病,有的话你们直接说。我改!

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

实现两个(多个)接口或者继承类时对同名方法的处理分析_第7张图片
很不幸,这里报错了:至于为啥我仔细想了下,两个接口中的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的方法,在父类和接口中都有,那么会如何调用呢
实现两个(多个)接口或者继承类时对同名方法的处理分析_第8张图片
实现两个(多个)接口或者继承类时对同名方法的处理分析_第9张图片
实现两个(多个)接口或者继承类时对同名方法的处理分析_第10张图片
实现两个(多个)接口或者继承类时对同名方法的处理分析_第11张图片
执行结果说明了啥?
:::如果父类和接口都定义了静态方法,如果通过是实现类调用的话调用的是父类的方法

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

你可能感兴趣的:(日常实验室,java)