zoukankan      html  css  js  c++  java
  • 当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!!!!! 
    -哔 ……

  • 相关阅读:
    表达式树
    二叉查找树
    二叉树的先中后序遍历
    利用树的先序和后序遍历打印 os 中的目录树
    栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
    C语言的运算符的优先级与结合性+ASCII表
    算法运行时间中的对数
    c++ primer 第三章 标准库类型
    C++ premier 中文版 学习笔记(第五章 表达式)
    使用applescript脚本方式以管理员权限运行
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6993867.html
Copyright © 2011-2022 走看看