• 当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!!!!! 
    -哔 ……

  • 相关阅读:
    [算法][递归]求阶乘
    [数据结构]ArrayStack
    [数据结构]Graph
    [数据结构]TrieTree
    [数据结构]UnionFindSet
    [算法]在数组中找到一个局部最小位置
    在二叉树中找到一个节点的后继节点
    [算法]折纸问题
    常用下载方式的区别-BT下载、磁力链接、电驴
    纯文本-FileOutputStream的解码方式
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6993867.html
Copyright © 2020-2023  润新知