当Java代码遇上抽象、重载加重写,一切都不美好了

当Java代码遇上抽象、重载加重写。一切都不美好了

前几天调程序遇上个奇怪的bug。一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存在这问题):

片段1:

    @Override
    public void printfData() {
        printfData("hello");
    }

第一眼看上去貌似没什么不正确,这段代码非常正常嘛。代码检查工具也没报错哇,为啥就就是不正确呢?

再细致看一眼:我靠。方法名和被调用的方法名是一样的,也就是说被调用方法是调用者方法的重载,而调用方法是重写的方法?那被重写的方法呢?它在哪儿?

继续查找……

经过一番查找,得到下面代码:
片段2:

public abstract class ImplementationClass extends AbstractClass {

    @Override
    public void printfData(String s) {
        System.out.println(s);
    }

}

片段3:

public abstract class AbstractClass {

    public abstract void printfData();

    public abstract void printfData(String s);
}

我靠,原来这货是抽象出来的。。

。。。

那么它会引起什么错误呢?

经过调试,居然发现,片段1中的代码没运行。编译器直接去调用片段三中的printfData()方法。

下面个人言论经过反和谐处理:

what fuck!!!!! 
-哔 ……

那么是怎么引起的这个问题呢?

经过咨询群里的大师级人物得知:
此乃编译过程的问题。带我慢慢道来……
(因为内容过于难以理解,so,我全忘了)
(假设有谁懂的,请在评论区解说写,Thanks)

大师给的解决方式:

改动方法命名,不要让出现一个代码出现重写重载加抽象的情况。

下面个人言论经过反和谐处理:

what fuck!!!!! 
-哔 ……

原文地址:https://www.cnblogs.com/blfbuaa/p/6993867.html